分配取消引用的shared_ptr
Assigning a dereferenced shared_ptr
考虑以下类:
struct MyClass {
int mId;
MyClass(int id): mId(id) {}
~MyClass() { std::cout << "deleting: " << mId << std::endl; }
};
和用法:
std::shared_ptr<MyClass> p(new MyClass(0));
MyClass& m = *p;
m = MyClass(2);
结果是:
deleting: 2
deleting: 2
请帮助我理解:
- 为什么有两个
MyClass(2)
对象(对析构函数日志所做的假设) - 这是内存泄漏吗?
MyClass(0)
不应该泄漏吗?
谢谢。
没有内存泄漏。此代码:
m = MyClass(2);
创建一个类型为 MyClass
的临时对象,该对象使用 MyClass
的(默认生成的)复制赋值运算符复制到 m
中,然后销毁。最终,p
超出范围,其析构函数会销毁指向的MyClass
实例(绑定到m
的实例)。
如果我们显式地拼写出所有隐式调用,就会发生这种情况:
// std::shared_ptr<MyClass> p(new MyClass(0));
tmp1.MyClass(0);
p.shared_ptr(&tmp1);
// MyClass& m = *p;
p.operator* ();
// m = MyClass(2);
tmp2.MyClass(2);
m.operator= (tmp2);
tmp2.~MyClass();
// p goes out of scope
p.~shared_ptr();
tmp1.~MyClass();
这样做是为了更清楚地了解创造破坏:
struct MyClass {
int mId;
MyClass(int id): mId(id) {std::cout << "Creating: " << this << "(" << mId << ")n";}
~MyClass() {std::cout << "Deleting: " << this << "(" << mId << ")n";}
MyClass(MyClass const& c)
{std::cout << "Copy: " << this << "(" << mId << ")n"
" From: " << &c << "(" << c.mId << ")n";
mId=c.mId;
}
MyClass& operator=(MyClass const& c)
{std::cout << "Assign: " << this << "(" << mId << ")n"
" From: " << &c << "(" << c.mId << ")n";
mId=c.mId;
}
};
当我跑步时,我得到:
Creating: 0x7fc741c000e0(0)
Creating: 0x7fff50ac38c0(2)
Assign: 0x7fc741c000e0(0)
From: 0x7fff50ac38c0(2)
Deleting: 0x7fff50ac38c0(2)
Deleting: 0x7fc741c000e0(2)
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理