C++中指针更改时内存泄漏
Memory Leak on Pointer Change in C++?
我定义了这些类型
typedef double* DoublePointer;
typedef vector<DoublePointer> DoubleVector;
typedef vector<DoubleVector> DoubleMatrix;
其中DoubleMatrix
实际上是一个包含指向doubles的指针的向量的向量。关于C++如何管理内存,我有两个问题:
- 假设我有一个
DoubleMatrix m
,然后呼叫m.clear()
。这会释放所有DoubleVector
和其中所有DoublePointers
的内存吗 - 如果我等于两个指针,比如
m[0][0] = m[1][1]
,那么m[0][0]
所指向的内存空间(例如指向2.0
)最终会被释放吗?(这个问题有道理吗?)
我希望我已经足够清楚了。我真的在用Cython编程,但它都是编译成C++的;虽然我对C有一些基本的了解,但这些细节我都不知道。
谢谢。
回答您的问题:
这会释放所有DoubleVectors和所有里面有DoublePointers吗?
否(释放DoubleVector的内存)和否(释放双指针的内存):
- 矢量是一种特殊类型的容器,它类似于一个数组。当你"清除"它时,你只会使所有位置无效,但不会调整它的大小,从而保留内存中的所有位置(标记为空)。最好的选项应该是清除的,然后调整大小(0)
- "T"h h e c c l e a r r d o e s n"T"c c c a r d o l l e T"T"h e e d o e e s T"T破坏函数被调用,但对于琐碎的指针,它们什么都不做,也不会释放指向的内存。请看评论。谢谢@BenVoigt看到这里
如果我等于两个指针,比如
m[0][0] = m[1][1]
,那么内存空间会m[0][0]
所指向的(例如2.0)最终会被释放吗?(这个问题有道理吗?)
不,它不能释放。这个问题是有道理的,通常人们只指向内存泄漏,但这种指针分配是许多双自由的起源:在分配m[0][0]
和m[1][1]
指向堆中的同一内存段后,如果你删除所有指针,你将释放两倍于m[0][0]
和m[1][1]
指向的内存段
如果想要自动垃圾收集,则需要使用智能指针。标准::矢量<>只是一个容器。在这种情况下,它是int的向量,因为指针是int(或size_t)值,它是实际数据的内存位置。指针超出范围。只是后面的那个int。但是,您分配的内存将保留!就像:
void memLeak()
{
int* x = new int[1024];
return;
}
在这种情况下,您分配了1024个int,但没有取消分配它们。然而,那个x超出了范围,被肉嘟嘟的大爪子摧毁了!要解决此问题,请使用智能指针为您执行GC!:
std::vector<shared_ptr<double> > name;
几周前,我遇到了一次内存泄漏,这让我很困惑,因为我使用的是智能容器。事实证明,泄漏背后的原因是内存没有被释放。指向该内存的指针超出了作用域,并且没有调用delete[]或free()!。
如果您不理解或想让我详细说明,请告诉我!:)
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏