如何在构造函数中正确初始化wchar_t指针并在析构函数

时间:2016-11-07 14:10:51

标签: c++ oop

我正在尝试在班上初始化wchar_t*

这是我的构造函数:

Book::Book()
{
    book = 0;
    auth = 0;
    setBook(TEXT(""));
    setAuth(TEXT(""));
}

这是我的析构函数:

Book::~Book()
{
    if (book)
        delete book;
    if (auth)
        delete auth;
}

这里是setBook()

void Book::setBook(TCHAR *a) {
    if (book)
        delete book;
    book = new TCHAR[lstrlen(a) + 1];
    lstrcpy(book, a);
}

问题在于,当我尝试创建新对象并将其推送到向量时,我在析构函数中删除书时出现运行时错误“程序已触发断点”。

这是我的载体:

for (int i = 0; !feof(f); i++) {
        reqBook.push_back(Book());
        reqBook[i].read(f);
    }

请注意我的问题,或者如何正确初始化?。

1 个答案:

答案 0 :(得分:2)

如果您管理资源,必须拥有复制构​​造函数和复制赋值运算符(或删除它们)。这是3的规则。对于C ++ 11,有一个移动构造函数和移动赋值运算符也是一个好主意(规则为5)。

如果您尝试将Book作为管理资源的类,那么当您通过复制或构建book或{{1}时,您会发现异常安全存在一些复杂性}。

解决方案是编写一个RAII类,它封装处理auth数组,并使wchar_tbook成为该类的对象。当你这样做时,你会发现你制作了一份穷人的auth副本。

崩溃的具体原因是std::wstring复制原始std::wstring对象。当它这样做时,它使用编译器生成的复制构造函数(因为你还没有提供)。这只是复制指针。原始对象的析构函数删除了这些指针指向的内存,现在你处于被称为"未定义行为的痛苦世界中。当向量中的对象被删除时,它也会尝试删除相同的内存,任何事情都可能发生 - 点击断点是一个特别无痛的结果。