如何在构造函数中正确初始化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);
}
问题是,当我试图创建新对象并将其推到vector时,当在析构函数中删除book时,我得到一个运行时错误"程序已触发断点"。
这是我的向量:
for (int i = 0; !feof(f); i++) {
reqBook.push_back(Book());
reqBook[i].read(f);
}
如果管理资源,必须具有复制构造函数和复制赋值操作符(或删除它们)。这就是"三法则"。在c++ 11中,有一个move构造函数和一个move赋值操作符(规则5)是个好主意。
如果您尝试使Book
成为管理资源的类,您将发现在复制或构造book
或auth
的过程中涉及到异常安全的一些复杂性。
解决方案是写一个RAII类封装处理wchar_t
的数组,并使book
和auth
都是该类的对象。当你这样做的时候,你会发现你已经做了一个穷人的std::wstring
副本。
唯一的不使用std::wstring
的原因是,如果它是一个类分配,你已经被明确禁止使用它。
崩溃的具体原因是std::vector
复制了原来的Book
对象。当它这样做时,它使用编译器生成的复制构造函数(因为您没有提供一个)。这只是复制指针。原始对象的析构函数删除了这些指针指向的内存,现在你就陷入了被称为"未定义行为"的痛苦世界。当vector中的对象被删除时,它也会尝试删除相同的内存,任何事情都可能发生——遇到断点是一个特别无痛的结果。
相关文章:
- 优先顺序:智能指针和类析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 当指针在 cpp 17 中失去引用时,是否会调用非默认析构函数?
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 如何将析构函数分配给指针
- 智能指针析构函数争用条件
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 在C++中删除指针数组时析构函数崩溃
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 删除析构函数C++中的指针
- 构造函数是否unique_ptr初始化原始指针unique_ptr析构函数是否也删除关联的原始指针?
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 在析构函数内取消引用指针时出现分段错误
- 共享指针析构函数中的内存顺序
- 在共享指针的值中调用 std::swap 调用一堆构造函数和析构函数
- 在特殊情况下使析构函数不是虚拟的,并删除基指针是否安全
- 删除对象而不调用成员指针的析构函数
- 析构函数在与 STL 的共享指针中调用两次