gpt4 book ai didi

c++ - push_back 使用移动构造函数不调用析构函数?

转载 作者:行者123 更新时间:2023-12-03 13:58:55 27 4
gpt4 key购买 nike

以下代码创建一个临时对象 A 并将其推送到一个 vector 中。
在 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
为什么打印函数不打印,也不调用析构函数?谢谢

最佳答案

由于您基本上在做,您的代码具有未定义的行为

std::cout << (char*)nullptr;
回想一下,您移动的对象的指针设置为 nullptr .
这是对那些标准库插入器的先决条件违反:

[ostream.inserters.character]

template<class charT, class traits>
basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& out, const charT* s);
template<class charT, class traits>
basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& out, const char* s);
template<class traits>
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, const char* s);
template<class traits>
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, const signed char* s);
template<class traits>
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out,
const unsigned char* s);

3 Preconditions: s is not a null pointer.


添加空检查,或者只是不要在析构函数中打印指针值。

关于c++ - push_back 使用移动构造函数不调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66257871/

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