我定义了这些类型
typedef double* DoublePointer;
typedef vector<DoublePointer> DoubleVector;
typedef vector<DoubleVector> DoubleMatrix;
其中DoubleMatrix
正如您所看到的那样,它实际上是包含指向双精度指针的向量的向量。关于C ++如何管理内存,我有两个问题:
DoubleMatrix m
并致电m.clear()
。这会释放所有DoubleVector
s及其中所有DoublePointers
的内存吗?m[0][0] = m[1][1]
,那么m[0][0]
指向的内存空间(例如2.0
)最终会被释放吗? (这个问题是否有意义?)我希望我足够清楚。我真的在Cython中编程,但它全部编译成C ++;虽然我对C有一些基本的了解,但这些细节却让我无法理解。
感谢。
答案 0 :(得分:2)
回答你的问题:
这会释放所有DoubleVectors和所有的所有 DoublePointerss在他们里面?
否(释放DoubleVector的内存)和否(释放DoublePointer的内存):
如果我等两个指针说
m[0][0] = m[1][1]
,那将是内存空间m[0][0]
所指向的(例如2.0)将最终被释放? (这个问题是否有意义?)
不,它不会释放。这个问题很有意义,通常人们只会指向内存泄漏,但这种指针分配是许多双重自由的起源:在赋值m[0][0]
和m[1][1]
指向同一内存段之后堆,如果你删除所有指针,你将释放m[0][0]
和m[1][1]
所指向的内存段的两倍
答案 1 :(得分:1)
如果您想要自动垃圾回收,则需要使用智能指针。一个std :: vector&lt;&gt;只是一个容器。在这种情况下,它是一个int的向量,因为指针是一个int(或size_t)值,它是实际数据的内存位置。指针超出范围。那只是那个int。但是,你分配的内存仍然存在!它就像:
void memLeak()
{
int* x = new int[1024];
return;
}
在这种情况下,您分配了1024个整数,但您没有释放它们。然而,那个x超出了范围并被大肉爪摧毁了! 要解决此问题,请使用智能指针为您执行GC!:
std::vector<shared_ptr<double> > name;
几个星期前,我遇到了因为我使用智能容器而导致内存泄漏的问题。事实证明泄漏背后的原因是内存没有被释放。指向该内存的指针超出了范围,并且没有调用delete []或free()!。
如果您不明白或想要我详细说明,请告诉我! :)