指针可以放在堆内存上吗(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++ 中见过任何人使用它。
我写了一些代码,试图在空闲存储区(堆内存)上创建一个指针。我认为这是不可能的,但我还是尝试了。
下面的代码基本上是在堆上创建一个指针向量,然后使向量中的那些指针指向堆上的一些整数。我想知道 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++ 中见过任何人使用它。