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

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

本文关键字:上吗 内存 指针      更新时间:2023-10-16

我编写了一些代码,其中我试图在免费存储(Heap Memory(上创建指针。我认为这是不可能的,但无论如何我都尝试过。

下面的代码基本上是在堆上创建一个指针向量,然后在矢量中使这些指针指向堆上的某些INT。我想知道矢量中的那些指称VEC的指针是否在堆上?我还想知道,在使用这样的矢量时,释放分配空间的正确方法是什么。最后一个删除声明正在崩溃该程序,因此我对此进行了评论。我不知道是否有内存泄漏。

    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 级别,您无法控制确切创建内存的位置。

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

像所有其他向量元素一样,vec的元素位于免费商店中,因为那是向量保留它们的地方。

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

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

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

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

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

如果要为整数分配内存,则可以说new int;,就像您在这里完成的一样。

new关键字将接受任何(非空间(类型。因此,如果要分配指针(将是类型int*(,则可以说new int*;

a(人为人为的(示例可能看起来像:

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

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


这都说,您不太可能需要分配原始的new int*。如果您正在处理动态分配的多维数组,那么您很可能会遇到类似的东西。

但是,在任何这些情况下,我都会强烈建议使用更现代的内存管理方法智能指针