我实现了一个以字符串为参数的构造函数,这导致析构函数被调用两次,然后程序崩溃(程序包含原始指针)。我知道这与使用这种类型的构造函数时以某种方式调用的副本构造函数有关。下面是说明问题的简单代码。

感谢您对如何修复程序以避免崩溃的评论。我需要使用这种构造函数。
我想了解为什么复制构造函数被调用。我没有做任何明确的任务。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

class DebugClass
{
public:
    DebugClass(void) {
        data = NULL;
    }

    DebugClass(std::string str) {
        data = new double[2];
        data[0] = 1.0;
        data[1] = 2.0;
    }

    DebugClass(DebugClass const& other) {
        cout << "copy construction\n";
    }

    ~DebugClass(void) {
        if (data)
        {
            delete [] data;
            data = NULL;
        }
    }

    double* data;
};


int main()
{
    DebugClass obj = DebugClass("Folder");
    return 0;
}

最佳答案

您的副本构造函数未完成data的初始化:

DebugClass::DebugClass(DebugClass const& other)
{
    cout << "copy construction\n";
}


因此,从那时起对数据的任何使用都会产生不确定的行为。

如果仅在此处将data设置为nullptr,则不应获得双重删除。虽然您可能真的想从other进行某种形式的复制。

这行:

DebugClass obj = DebugClass("Folder");


导致复制构造函数在构造obj时被调用。

如果您改为:

DebugClass obj("Folder");


那么obj将使用普通的构造函数构造。

09-10 04:29
查看更多