gpt4 book ai didi

c++ - 如何在构造函数中正确初始化wchar_t指针并在析构函数中删除它

转载 作者:行者123 更新时间:2023-11-28 01:58:10 25 4
gpt4 key购买 nike

我正在尝试在我的类中初始化一个 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);
}

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

这是我的 vector :

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

请知道我的问题,或者如何正确初始化?

最佳答案

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

如果您尝试使 Book 成为管理资源的类,您会发现在复制或构造 bookauth

解决方案是写一个RAII类,封装wchar_t数组的处理,并使bookauth成为它的对象类(class)。当你这样做时,你会发现你制作了一份 std::wstring 的穷人拷贝。

唯一不为此使用 std::wstring 的原因是,如果它是一个类赋值,您被明确禁止使用它。

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

关于c++ - 如何在构造函数中正确初始化wchar_t指针并在析构函数中删除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40467234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com