C++中指针更改时内存泄漏

Memory Leak on Pointer Change in C++?

本文关键字:内存 泄漏 指针 C++      更新时间:2023-10-16

我定义了这些类型

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

其中DoubleMatrix实际上是一个包含指向doubles的指针的向量的向量。关于C++如何管理内存,我有两个问题:

  1. 假设我有一个DoubleMatrix m,然后呼叫m.clear()。这会释放所有DoubleVector和其中所有DoublePointers的内存吗
  2. 如果我等于两个指针,比如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()!。

如果您不理解或想让我详细说明,请告诉我!:)