我在使用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_ptr
和import 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中解决的问题还是我没有看到的东西?
谢谢!
答案 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(因为弱指针不会增加引用计数器),因此删除了堆上的资源。