【发布时间】:2019-10-07 03:27:03
【问题描述】:
我编写了一些代码,试图在空闲存储(堆内存)上创建一个指针。我认为这是不可能的,但我无论如何都尝试了。
下面的代码基本上是在堆上创建一个指针向量,然后使向量中的这些指针指向堆上的一些整数。我想知道称为 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;
【问题讨论】:
-
//delete [] vec;是您需要的未定义行为delete vec;不是delete [] vec; -
delete[]用于匹配您从未使用过的new[]。就这么简单。 -
您不创建指针。一个指针指向内存区域。这些可以包含对象,这些对象确实是被构造的。
-
FWIW,你几乎不想做
vector<int*> *vec = new vector<int*>();。向量本身会对它持有的对象使用动态分配,因此您不需要动态分配向量。 -
每个 c++ 套件都有可能是唯一的实现细节。我的 Lubuntu 18.04 64 位,g++ v7 将 sizeof(std::vector
) 报告为 24 字节,不管 T,不管有多少元素。您的系统 std::vector 可能不同。
标签: c++ pointers vector heap-memory stack-memory