我无法解释他的行为
Behaviour I cant explain
本文关键字:无法解释 更新时间:2023-10-16
下面的代码实际编译并运行;
template <typename T>
class heap_ptr
{
public:
heap_ptr(T* p) : t(p) {}
heap_ptr(const heap_ptr&) = delete;
template<typename ... U> heap_ptr( U ... u )
{
t = new T(u...);
}
T* operator -> () { return t; }
// T& operator = (const T& o) { (*t)=o; return *t; }
operator T () { return *t; }
~heap_ptr() { delete t; }
private:
T* t;
};
struct A { int x,y; A(int x,int y):x(x),y(y){} };
void try_it()
{
heap_ptr<A> woop {8,11};
A a{5,3};
woop = a; // <- here
}
但是,标记的赋值将垃圾放入woop中。为什么它可以编译为什么我在woop里放垃圾?
注意:如果我取消对赋值操作符的注释,它会按预期工作,这不是问题。
如果我取消赋值操作符的注释,它会像预期的那样工作,那就是这不是问题
这正是问题所在。默认情况下生成的复制赋值操作符将复制指针,而不是指针后面的对象。然后销毁临时对象heap_ptr(a),删除指向的数据。
这个问题是由于没有实现你的operator=
,你依赖于默认的一个,它会复制临时对象的指针,然后销毁它,一旦复制完成,给你留下一个无效的指针。
这是不遵循3规则(c++ 11中为5)而派生出的问题集的一个实例。但是,如果可以的话,你应该遵循零规则。
您正在尝试重新实现智能指针。只要使用std::unique_ptr
,它就不会像你期望的那样编译:
struct A { int x,y; A(int x,int y):x(x),y(y){} };
void try_it()
{
std::unique_ptr<A> woop{ new A(8, 11) };
A a{5,3};
woop = a;
}
现场演示
相关文章:
- 无法解释以下C++代码段的输出
- 数组中无法解释的最后一个项目
- 对于相同的精确计算,无法解释的不同OMP_GET_WTIME()
- C 常量无法解释的行为
- C 无法解释的类“尚未声明”错误,这是由于名称空间而导致的
- [C++]重新定义 y 值的基本数组代码。它正在工作,但无法解释为什么
- std::future::wait 是内存障碍吗?(我无法解释这种数据竞赛)
- unsigned int/signed int/long-long:无法解释的输出
- C++:带有cout和指向char的指针的无法解释的行为
- 我的C++片段中无法解释的断言失败
- C 构造函数中无法解释的调用
- Excel VBA中C++DLL位置存在无法解释的行为
- 无法解释的 VIM 或 GCC 行为
- Marshal.StructureToPtr出现无法解释的内存泄漏
- 为什么这个自定义比较器在构造 std::p riority_queue 时无法解释 std::sort
- QT应用程序无法解释使用SQLite插入功能
- 无法解释的链接器错误
- 无法解释编译器的行为
- C时间混合问题似乎无法解释,以及如何明智地升级代码库
- C++中一些无法解释的错误