具有预定义大小的 C++ 数组作为成员变量和内存泄漏

标签 c++ arrays memory-leaks

希望我的问题不是多余的。我发现一些帖子与我的问题很接近,但并不完全相同。

我有一段代码是这样的:

 class myClass
 {
    public:
    myClass(){
        for(int i=0;i<1000;i++){
            myArray[i]=i;
        }
    };
    ~myClass(){};

    int getValue(int index){return myArray[index];}

   private:
        int myArray[1000];
 } ;

int myFunction(myClass* myObject)
{
    int res=0;
    for(int i=0;i<1000;i++){
        res=res+myObject->getValue(i);
    }
    delete myObject;
    myObject = new myClass();
    return res;
}

int main()
{
    myClass *myObject = new myClass();
    int res= myFunction(myObject);

    delete myObject;
    return res;
}

我的代码中是否存在内存泄漏?或者这样可以吗?我不确定应该如何处理数组。

谢谢, 朱尔斯

最佳答案

myObject = new myClass(); 只修改函数内部的局部指针,而不修改 main 中声明的指针。

这就是为什么在 myFunction 中分配的 myClass 对象被泄露,你最终将 main 中的指针指向的对象双删除到(这是未定义的行为)。

这是因为指针默认是通过拷贝传递的。如果您希望函数修改 main 中的指针,请将引用传递给它:

int myFunction(myClass*& myObject)
                       ^

关于数组,它是一个自动变量。所以它绑定(bind)到当前堆栈框架并因此自动释放,您无需执行任何操作。如果您使用 new[] 手动分配了数组, 那么您是否需要明确地delete[] 它。

关于具有预定义大小的 C++ 数组作为成员变量和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582877/

相关文章:

c++ - 编译器错误 : "does not name a type" in macro when compiling with g++

c++ - 给定一个巨大的整数字符串,检查它是否是 2 的幂

c++ - 为什么允许在 switch 语句中声明变量?但不是声明+初始化?

c - libcurl 中的内存泄漏

c++ - 解析符号是什么意思?

Javascript 将 2 个对象添加到数组中,而不是 1 个。一种是未定义的

javascript - 对象内部的函数不返回值

javascript - 在多维数组javascript或coffeescript中获取最大值

mongodb - 使用 MongoDB 的 Grails 中的内存泄漏

java - lsof 表明我的 java 进程正在泄漏/devices/pseudo/tl@0 :ticots