[英]How to initialize wchar_t pointer correctly in constructor and delete it in destructor
我正在尝试在类中初始化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);
}
请对我的问题有任何想法,或者如何正确初始化?
如果管理资源,则必须具有副本构造函数和副本分配运算符(或删除它们)。 这是3的规则。在C ++ 11中,最好有一个move构造函数和一个move赋值运算符(5的规则)。
如果尝试使Book
成为管理资源的类,则在复制或构造book
或auth
,您会发现异常安全涉及一些复杂性。
解决方案是编写一个RAII类,该类封装处理wchar_t
数组的处理,并使book
和auth
成为该类的对象。 完成此操作后,您会发现您已经制作了一个穷人的std::wstring
副本。
对此不使用std::wstring
的唯一原因是,如果它是特别禁止您使用的类分配。
发生崩溃的具体原因是std::vector
复制了原始的Book
对象。 这样做时,它将使用编译器生成的副本构造函数(因为您没有提供一个)。 这只是复制指针。 原始对象的析构函数将删除这些指针所指向的内存,现在您处在痛苦的境地,即“未定义的行为”。 当向量中的对象被删除时,它也会尝试删除相同的内存,并且任何事情都可能发生-达到断点是一个特别轻松的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.