使用std :: make_shared进行std :: weak_ptr赋值

时间:2017-05-31 10:56:51

标签: c++11 weak-ptr make-shared

我在使用std::make_shared#include <iostream> #include <memory> int main() { std::weak_ptr<int> weak; std::shared_ptr<int> shared {std::make_shared<int>(42)}; weak = shared; std::cout << "Meaning of life: " << *weak.lock() << std::endl; weak = std::make_shared<int>(23); std::cout << "Meaning of life: " << *weak.lock() << std::endl; return 0; } 时偶然发现了这种行为,我发现它有点奇怪。我正在使用C ++ 11。

std::cout

第一个std::weak_ptr打印正常,第二个给我一个段错误。我尝试在cppreference上查看std::shared_ptrimport UIKit import CoreData class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white let appDelegate = UIApplication.shared.delegate as!AppDelegate let context = appDelegate.persistentContainer.viewContext //adding new user and saving in database... let newUser = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context) newUser.setValue("Batman", forKey: "username") newUser.setValue("Robin", forKey: "password") do { try context.save() print("saved") } catch { print("Error occured...") } // restoring data back from database let request = NSFetchRequest < NSFetchRequestResult > (entityName: "Users") request.returnsObjectsAsFaults = false do { let results = try context.fetch(request) if results.count > 0 { for result in results as![NSManagedObject] { if let username = result.value(forKey: "username") as ? String { print(username) } } } else { print("No results") } } catch { print("Couldn't fetch results") } } } 的网页,但我仍然不明白为什么会这样。必须创建一个临时对象对我来说感觉很麻烦,这是在C ++ 14中解决的问题还是我没有看到的东西?

谢谢!

2 个答案:

答案 0 :(得分:5)

如果weak_ptr对象仍然存在,指向同一个底层对象,则只能在锁定后取消引用shared_ptr

在你的第一部分

std::shared_ptr<int> shared {std::make_shared<int>(42)};
weak = shared;
std::cout << "Meaning of life: " << *weak.lock() << std::endl;
确实如此。在第二部分

weak = std::make_shared<int>(23);
std::cout << "Meaning of life: " << *weak.lock() << std::endl;

情况并非如此,因为shared_ptr是临时对象。

你在这里遇到的正是weak_ptr的构建 - 它只有在其他shared_ptr指向同一个底层对象时才有效。那是its purpose

  

std :: weak_ptr是一个智能指针,它包含对由std :: shared_ptr管理的对象的非拥有(“弱”)引用...如果此时销毁了原始的std :: shared_ptr,对象的生命周期延长,直到临时的std :: shared_ptr也被销毁。

答案 1 :(得分:4)

这是因为您创建了一个临时共享指针,并在此行中立即将其指定给弱指针:

weak = std::make_shared<int>(23);

赋值运算符结束后,临时共享指针被破坏,引用计数达到0(因为弱指针不会增加引用计数器),因此删除了堆上的资源。