C ++中指针变化的内存泄漏?

时间:2015-02-16 03:10:05

标签: c++ pointers

我定义了这些类型

typedef double* DoublePointer;
typedef vector<DoublePointer> DoubleVector;
typedef vector<DoubleVector> DoubleMatrix;

其中DoubleMatrix正如您所看到的那样,它实际上是包含指向双精度指针的向量的向量。关于C ++如何管理内存,我有两个问题:

  1. 说我有DoubleMatrix m并致电m.clear()。这会释放所有DoubleVector s及其中所有DoublePointers的内存吗?
  2. 如果我等两个指针说m[0][0] = m[1][1],那么m[0][0]指向的内存空间(例如2.0)最终会被释放吗? (这个问题是否有意义?)
  3. 我希望我足够清楚。我真的在Cython中编程,但它全部编译成C ++;虽然我对C有一些基本的了解,但这些细节却让我无法理解。

    感谢。

2 个答案:

答案 0 :(得分:2)

回答你的问题:

  

这会释放所有DoubleVectors和所有的所有   DoublePointerss在他们里面?

否(释放DoubleVector的内存)和否(释放DoublePointer的内存):

  • Vector是一种特殊类型的容器,它类似于数组。当你“清除”它时,你只是使所有位置无效,但你没有调整它的大小,保留在内存中的所有位置(标记为空)。最好的选择应该是明确的,并在调整大小后(0);
  • 清除̶d̶o̶e̶s̶n̶'̶t̶调用析构函数的包含项目的析构函数调用,但是对于琐碎的三分球,他们什么也不做,他们不释放内存尖。请看评论。谢谢@BenVoigt see here
  

如果我等两个指针说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()!。

如果您不明白或想要我详细说明,请告诉我! :)