呼叫获取后,将共享_ptr分配给另一个
Assigning a shared_ptr to another after calling get
shared_ptr<std::string> shared_ptr1 = std::make_shared<std::string>("Foo");
shared_ptr<std::string> shared_ptr2 = std::make_shared<std::string>("Bar");
std::string* normal_ptr = shared_ptr1.get();
shared_ptr1 = shared_ptr2;
现在,在" shared_ptr1 = shared_ptr2 "分配之后,第一个字符串" foo"是垃圾收集吗?据此," Foo"不是收集垃圾。但是我只想确保我遇到的不是不确定的行为。
谢谢!
现在,第一个字符串" foo"会在" shared_ptr1 = shared_ptr2"分配之后收集垃圾?*
如果您的意思是由std::make_shared<std::string>("Foo")
分配的字符串被销毁,则是。
这意味着normal_ptr
,在您执行shared_ptr1 = shared_ptr2;
指向不再存在的对象之后。
我不会使用"收集垃圾"短语。在上述分配后,将简单地删除该对象,因为没有共享的_ptr指向它。您可以使用以下代码进行测试:
struct S{
std::string s;
S(std::string s){
this->s = s;
}
~S(){
std::cout << "~S() with string " << s << std::endl;
}
};
int main()
{
std::shared_ptr<S> shared_ptr1 = std::make_shared<S>("Foo");
std::shared_ptr<S> shared_ptr2 = std::make_shared<S>("Bar");
S* normal_ptr = shared_ptr1.get();
std::cout << "after get()" << std::endl;
shared_ptr1 = shared_ptr2;
std::cout << "end of main" << std::endl;
}
给出
after get()
~S() with string Foo
end of main
~S() with string Bar
这意味着分配后,normal_ptr
指向不存在的对象。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- OpenSSL:当输出ptr为空时,BIGNUM的bin2bn不会分配新的BIGNUM
- 为什么在将常量 ptr 分配给常量引用时没有收到编译错误?
- 如何将函数 ptr 分配给函数 ptrs 数组(Arduino C++)
- 尝试为图像缓冲区分配内存时 ptr 值错误
- 当使用运算符 new 更改为其他内存的指向已分配内存的 ptr 时会发生什么
- 将现有值分配给智能ptr
- gcc共享ptr副本分配实现
- Boost Scoped Ptr-声明与分配
- 在另一个线程中分配唯一ptr的错误
- 分配const char *ptr数组参数?c++