我正在尝试在班上初始化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);
}
请注意我的问题,或者如何正确初始化?。
答案 0 :(得分:2)
如果您管理资源,必须拥有复制构造函数和复制赋值运算符(或删除它们)。这是3的规则。对于C ++ 11,有一个移动构造函数和移动赋值运算符也是一个好主意(规则为5)。
如果您尝试将Book
作为管理资源的类,那么当您通过复制或构建book
或{{1}时,您会发现异常安全存在一些复杂性}。
解决方案是编写一个RAII类,它封装处理auth
数组,并使wchar_t
和book
成为该类的对象。当你这样做时,你会发现你制作了一份穷人的auth
副本。
仅
崩溃的具体原因是std::wstring
复制原始std::wstring
对象。当它这样做时,它使用编译器生成的复制构造函数(因为你还没有提供)。这只是复制指针。原始对象的析构函数删除了这些指针指向的内存,现在你处于被称为"未定义行为的痛苦世界中。当向量中的对象被删除时,它也会尝试删除相同的内存,任何事情都可能发生 - 点击断点是一个特别无痛的结果。