繁体   English   中英

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

[英]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成为管理资源的类,则在复制或构造bookauth ,您会发现异常安全涉及一些复杂性。

解决方案是编写一个RAII类,该类封装处理wchar_t数组的处理,并使bookauth成为该类的对象。 完成此操作后,您会发现您已经制作了一个穷人的std::wstring副本。

对此不使用std::wstring唯一原因是,如果它是特别禁止您使用的类分配。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM