可以将指针放在堆内存(C )上吗?
Can a pointer be placed on heap memory (C++)?
我编写了一些代码,其中我试图在免费存储(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*
。如果您正在处理动态分配的多维数组,那么您很可能会遇到类似的东西。
但是,在任何这些情况下,我都会强烈建议使用更现代的内存管理方法智能指针。
- 64位机器上的C++内存对齐
- Valgrind 在 QThread::start() 上报告内存泄漏
- main() 总是在堆栈上吗?
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 唯一指针是否在堆或堆栈上分配内存?
- 堆上的内存如何耗尽?
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- 对象的 ctor 和 dtor 必须在同一线程上吗?
- 如果没有指针,如何识别堆栈上的内存?
- 如何在 2d 矢量上进行内存设置
- 如何最小化嵌入式平台上的内存分配
- 模板化动态数组上的内存泄漏
- 可以将指针放在堆内存(C )上吗?
- 通用 Windows 平台上的内存泄漏检测
- 结构上的内存分配和复制构造函数
- 堆栈上的内存泄漏
- 如何在Windows和更高版本上保留内存,并将文件映射到内存中
- 无法在 Mac OS X 上分配内存错误 - java(xx,xx) malloc: *** mmap(size=XX)
- 在 CUDA 上__constant__内存和多 GPU
- 为什么在同一x64机器的2个不同项目上对内存的解释不同?这是Endianness吗?