【发布时间】:2021-02-18 10:16:24
【问题描述】:
以下代码创建一个临时对象 A 并将其推入向量中。 复制构造函数被删除,并在 push_back 期间调用移动构造函数。我不确定这段代码的设计是否正确,肯定有内存泄漏。
#include<iostream>
#include<vector>
using namespace std;
class A
{
private:
char* ptr;
public:
A(const string& str)
{
ptr = new char[str.size()];
copy(str.begin(), str.end(), ptr);
cout << ptr << " Constructor\n" ;
}
A(const A& a) = delete; // copy constructor
A( A&& a)
{
cout << "Move constructor\n";
ptr = a.ptr;
a.ptr = nullptr;
}
~A()
{
cout << ptr << " Destructor\n";
delete[] ptr;
ptr = nullptr;
}
void print()
{
cout << ptr << endl;
}
};
int main()
{
vector<A> v;
v.reserve(5);
v.push_back( A("hello") );
v[0].print();
cout << "here" << endl;
return 0;
}
输出是:
hello Constructor
Move constructor
为什么print函数不打印,析构函数没有被调用?谢谢
【问题讨论】:
-
析构函数可能会崩溃,因为您尝试打印 nullptr
-
我认为问题可以简化为
std::cout << (char*)nullptr;- 我不确定打印应该如何表现。 -
std::cout << (char *)nullptr将调用接受两个参数的operator<<()(第一个是通过引用对模板化std::basic_ostream进行特化,第二个是const char *)。该运算符假定第二个参数指向一个以空字符结尾的字符串(的第一个字符),否则具有未定义的行为。由于(char *)nullptr不指向以空结尾的字符串,因此行为未定义。 -
我认为您的
char*缺少空终止符;std::string::size()不包括它的空终止符。 -
这并没有解决问题,但是析构函数中的
ptr = nullptr;并没有完成任何事情。物体正在消失;ptr在析构函数返回后将不存在,因此它的值无关紧要。
标签: c++