C++ C++;?

C++ C++;?,c++,pointers,C++,Pointers,我定义了这些类型 typedef double* DoublePointer; typedef vector<DoublePointer> DoubleVector; typedef vector<DoubleVector> DoubleMatrix; typedef双*双指针; typedef向量双向量; typedef向量双矩阵; 其中,DoubleMatrix正如您所见,它实际上是一个向量向量,包含指向double的指针。关于C++如何管理内存,我有两个问题:

我定义了这些类型

typedef double* DoublePointer;
typedef vector<DoublePointer> DoubleVector;
typedef vector<DoubleVector> DoubleMatrix;
typedef双*双指针;
typedef向量双向量;
typedef向量双矩阵;
其中,
DoubleMatrix
正如您所见,它实际上是一个向量向量,包含指向double的指针。关于C++如何管理内存,我有两个问题:

  • 假设我有一个
    DoubleMatrix m
    并调用
    m.clear()
    。这是否会释放所有
    双向量
    s和其中所有
    双指针
    s的内存
  • 如果我等于两个指针,比如说
    m[0][0]=m[1][1]
    ,那么
    m[0][0]
    指向的内存空间(例如指向
    2.0
    )最终会被释放吗?(这个问题有意义吗?)
  • 我希望我说得够清楚了。我在Cython编程,但全部编译成C++;虽然我有一些C语言的基本知识,但这些细节我还是想不起来


    谢谢。

    要回答您的问题:

    这会释放所有双向量和所有 里面有双指针吗

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

    • 向量是一种特殊的容器,它类似于一个数组。当您“清除”它时,您只是使所有位置无效,但不调整其大小,保留内存中的所有位置(标记为空)。最好的选项应该是清晰的,然后调整大小(0)
    • 8.0 0 0 0 0 0奈奈奈泰泰泰泰泰泰奈奈奈奈奈奈奈泰泰泰泰泰奈奈奈奈奈泰泰泰泰泰奈奈奈奈泰泰泰泰泰奈奈奈奈奈泰泰泰奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈泰泰泰泰奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈奈"c,T,c,o,r,a,i,n,e,d,e,e,c,o,n,T,a,e,i,T,e,e,m"s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s。请看评论。谢谢@BenVoigt
    如果我等于两个指针,比如说
    m[0][0]=m[1][1]
    ,内存空间
    m[0][0]
    指向的(例如指向2.0)最终将被释放? (这个问题有意义吗?)


    不,它不能释放。这个问题是有道理的,通常人们只指向内存泄漏,但这种指针分配是许多双自由的起源:赋值后
    m[0][0]
    m[1][1]
    指向堆中的同一内存段,如果你做一个删除所有指针的操作,您将释放两次
    m[0][0]
    m[1][1]

    所指向的内存段。如果您想要自动垃圾收集,则需要使用智能指针。std::vector只是一个容器。在这种情况下,它是一个int向量,因为指针是一个int(或size_t)值,它是指向实际数据的内存位置。指针超出范围。后面就是那个整数。但是,您分配的内存将保留!就像:

    void memLeak()
    {
        int* x = new int[1024];
        return;
    }
    
    在这种情况下,您分配了1024个整数,但没有取消分配。然而,那个x却超出了范围,被巨大的肉质爪子摧毁了! 要解决此问题,请使用智能指针为您执行GC!:

    std::vector<shared_ptr<double> > name;
    
    std::向量名;
    
    几周前,我遇到了一个令人困惑的内存泄漏,因为我使用的是智能容器。事实证明,泄漏背后的原因是内存没有被释放。指向该内存的指针超出范围,并且没有调用delete[]或free()


    如果您不理解某些内容或希望我详细说明,请告诉我!:)

    这不是一个“C”问题,因此建议去掉“C”标记。您似乎对向量和数组感到困惑--
    vector[DoublePointer]
    不会编译。也许你的意思是
    std::vector
    ?或者您可能想编写
    双指针[MAX\u SIZE]
    。这取决于你指的是C还是C++抱歉@chrisdd,这就是你用Cython写它的方式。我认为C++代码应该是代码>向量双向量。这不是完全正确的。特别是,你的第二颗子弹是完全错误的。DoubleVector析构函数将全部运行,从而释放它们所持有的缓冲区(双指针数组)。反过来,双指针析构函数将运行,但它们什么也不做(原始指针有平凡的析构函数,它们不会释放指向内存)。最后,DoubleMatrix持有的内存(DoubleVector对象本身的空间,这只是元数据)是正确的将恢复到未使用的容量,而不是被释放。@BenVoigt,你是对的,我看起来不像std::vector::clear reference。对象析构函数被调用。请随意编辑我的答案。谢谢你们的更正,谢谢大家。所以我认为我应该遍历所有的
    DoublePointer
    并对它们调用
    free
    ,以避免泄漏?@CristianGarcia:如果这是指向该数据的唯一指针,那么最好在丢失指针之前调用一个释放函数。可以是
    free
    delete
    HeapFree
    或任何与用于分配内存的函数匹配的函数。指针不是int,而是指针。它指示在内存中可以找到另一个值的位置。不过,你剩下的解释很好,不是整数,你是对的。然而,int是可视化关系的一种方式。