c++ - 局部变量在超出范围时删除另一个变量的内存

标签 c++ destructor local-variables

<分区>

在设计动态分配内存的类时,我遇到了以下有关内存分配的问题。我希望你们中的一些人能够为我指明正确的方向,让我知道我应该如何以更好的方式设计我的类(class)。我的类动态分配内存,因此也在其析构函数中将其删除。

为了说明问题,请考虑以下愚蠢的类声明:

class testClass{
    int* data;
public:
    testClass(){
        data = new int;
        *data = 5;
    }
    ~testClass(){
        delete data;
    }
};

到目前为止一切顺利。现在假设我在 main 中创建了这些对象之一

int main(){
    testClass myObject;
    return 0;
}

当然仍然没有问题。但是,假设我现在编写一个函数,将 testClass 对象作为输入并从 main 中调用它。

void doNoting(testClass copyOfMyObject){
    //do nothing
}
int main(){
    testClass myObject;
    doNothing(myObject);
    return 0;
}

这一次,该函数创建了一个局部变量 copyOfMyObject,它只是 myObject 的一个拷贝。然后当到达该函数的末尾时,该本地对象自动调用其析构函数,该析构函数删除其数据指针指向的内存。但是,由于这是 myObject 的数据指针所指向的同一内存,myObject 在此过程中无意中删除了它的内存。我的问题是:设计类(class)的更好方法是什么?

最佳答案

当您调用 doNothing() 时,它会复制您的 testClass 对象,因为它是按值传递的。不幸的是,当这个拷贝被销毁时,它会调用析构函数,它会删除 testClass 的原始实例使用的相同 data

您想了解“复制构造函数”和“通过引用传递”。也就是说,您应该为您的类定义一个复制构造函数,以便在对实例进行复制时,它会为其 data 成员分配自己的内存。此外,您可以传递指针或对 doNothing() 的引用,而不是按值传递,这样就不会进行复制。

关于c++ - 局部变量在超出范围时删除另一个变量的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15231501/

相关文章:

c++ - 在程序关闭期间终止 Qt 工作线程

javascript - 迭代对象、解构并推送到 React 状态数组

c++ - 我需要删除析构函数中的基本数据类型吗? C++

Python局部变量被修改但最后没有显示

c# - Lambda 分配局部变量

java - 幕后事件和事件处理

c++ - 对于对象图,我可以放置对象还是成对放置对象?

c++ - 从 C C++ 中的文件中读取矩阵

c++ - Dev-C++ 和 Code::Blocks 中的析构函数困惑

java - 未使用的局部变量 Java 8 - java.lang.VerifyError : Inconsistent stackmap frames