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

Can a pointer be placed on heap memory (C++)?

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

下面的代码基本上是在堆上创建一个指针向量,然后使向量中的那些指针指向堆上的一些整数。我想知道 vector vec 中的那些指针是否在堆上?我还想知道在使用这样的向量时释放 space 分配的正确方法是什么。最后的删除语句使程序崩溃,所以我把它注释掉了。不知道是不是内存泄露

    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;

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

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

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

如果你想为一个整数分配内存,你可以说 new int;,就像你在这里所做的那样。

new 关键字将接受任何 (non-void) 类型。所以如果你想分配一个指针(类型为 int*),你可以只说 new int*;

一个(精心设计的)示例可能如下所示:

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

请注意,由于 new 将 return 指向我们分配的任何类型的地址(在本例中为 int*),我们需要将其分配给 int**变量。


综上所述,您不太可能需要分配原始 new int*。如果您正在处理动态分配的 multi-dimensional 数组,您很可能会 运行 进入类似的东西。

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

了解指针最重要的一点是指针没有什么特别之处。

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

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

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

然而,在实践中这样做没有什么意义 — 我不认为在我 twenty-odd 年的 C++ 中见过任何人使用它。