指针可以放在堆内存(C ++)上吗?

时间:2019-05-20 18:30:28

标签: c++ pointers vector heap-memory stack-memory

我写了一些代码,试图在Free store(堆内存)上创建一个指针。我认为这是不可能的,但我还是尝试了。

下面的代码基本上是在堆上创建一个指针向量,然后使向量中的那些指针指向堆上的一些整数。我想知道向量中称为vec的那些指针是否在堆上?我还想知道在使用这样的向量时释放分配的空间的正确方法是什么。最后一条delete语句使程序崩溃,因此我将其注释掉。我不知道是否有内存泄漏。

    vector<int*> *vec = new vector<int*>();
    vec->push_back(new int(1));
    vec->push_back(new int(2));
    vec->push_back(new int(3));
    cout << (*vec)[0] << " " << (*(*(vec))[0]) << endl;
    cout << (*vec)[1] << " " << (*(*(vec))[1]) << endl;
    cout << (*vec)[2] << " " << (*(*(vec))[2]) << endl;
    delete (*vec)[0];
    delete (*vec)[1];
    delete (*vec)[2];
    //delete [] vec;

4 个答案:

答案 0 :(得分:6)

可以在堆中创建任何变量,包括指针。 就是说,在C ++级别,您无法控制内存的确切创建位置。

答案 1 :(得分:2)

关于指针最重要的事情是,关于指针没有什么特别的。

与所有其他矢量元素一样,vec的元素也位于免费存储中,因为矢量是它们保存它们的地方。

如果您想在免费商店中手动创建int*,您会说new int*,它当然会返回该指针的地址,例如

int** pointer = new int*(nullptr);

但是,在实践中这样做几乎没有意义-我认为我在20多年的C ++中没有人使用过它。

答案 2 :(得分:0)

在堆上创建指针的c ++方法如下: int** pointerToPointer = new int*;

类型int**可以作为指向指针的指针读取。然后,我们使用new在堆上分配int*类型的数据(int指针)。

答案 3 :(得分:0)

如果您要为整数分配内存,可以像此处所做的那样说new int;

new关键字将接受任何(非无效)类型。因此,如果您要分配一个指针(类型为int*),则可以只说new int*;

一个非常人为的例子可能看起来像:

int thing = 7;
int **ptr = new int*(&thing);
std::cout << "**ptr = " << **ptr << std::endl;

请注意,由于new将返回指向我们分配的任何类型的地址(在这种情况下为int*),因此我们需要将其分配给int**变量。


所有这些,您几乎不需要分配原始的new int*。如果要处理动态分配的多维数组,很有可能遇到类似的情况。

但是在任何这些情况下,我都会强烈建议通过Smart Pointers使用更现代的内存管理方法。