我写了一些代码,试图在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;
答案 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使用更现代的内存管理方法。