【发布时间】:2021-11-05 21:19:19
【问题描述】:
对于共享指针,如何测试它是否已分配但尚未分配? 例如:
案例 1. 使用 make_shared 创建共享指针
std::shared_ptr<Entity> es = std::make_shared<Entity> ();
std::cout << "es: " << es.get() << std::endl;
if (es) {
std::cout << "es assigned to something" << std::endl;
} else {
std::cout << "es not assigned to something" << std::endl;
}
if (es.get() == nullptr) {
std::cout << "es assigned to nullptr" << std::endl;
} else {
std::cout << "es not assigned to nullptr" << std::endl;
}
案例 2. 创建指向 nullptr 的原始指针。将 shared_ptr 指向这个原始指针
Entity* raw_entity_ptr2=nullptr;
std::shared_ptr<Entity> es2 = std::shared_ptr<Entity> (raw_entity_ptr2);
std::cout << "es2: " << es2.get() << std::endl;
if (es2) {
std::cout << "es2 assigned to something" << std::endl;
} else {
std::cout << "es2 not assigned to something" << std::endl;
}
if (es2.get()==nullptr) {
std::cout << "es2 assigned to nullptr" << std::endl;
} else {
std::cout << "es2 not assigned to nullptr" << std::endl;
}
案例 3. 创建指向实例化对象的原始指针。将 shared_ptr 指向这个原始指针。
Entity* raw_entity_ptr=new Entity;
std::shared_ptr<Entity> es3 = std::shared_ptr<Entity> (raw_entity_ptr);
std::cout << "es3: " << es3.get() << std::endl;
if (es3) {
std::cout << "es3 assigned to something" << std::endl;
} else {
std::cout << "es3 not assigned to something" << std::endl;
}
if (es3.get()==nullptr) {
std::cout << "es3 assigned to nullptr" << std::endl;
} else {
std::cout << "es3 not assigned to nullptr" << std::endl;
}
产生以下输出:
es: 0xa44de0
es assigned to something
es not assigned to nullptr
es2: 0
es2 not assigned to something
es2 assigned to nullptr
es3: 0xa44e20
es3 assigned to something
es3 not assigned to nullptr
如何进行区分案例 1 和案例 3 的测试?
【问题讨论】:
-
你说的“内存空白”是什么意思?
-
就是你在做什么,如果(es):en.cppreference.com/w/cpp/memory/shared_ptr/operator_bool,请注意,如果引用计数达到 0,则将 nullptr 分配给 shared_ptr 将释放其关联的内存(en.cppreference.com/w/cpp/memory/shared_ptr/operator%3D)然后删除内存
-
在你的第一行之后,
es指向一个动态分配的、值构造的Entity(就像Entity{})。一切都已正确初始化,没有明显的任务要做,所以你能澄清你的问题吗? -
这与
std::shared_ptr无关,您必须从您的对象中处理它。例如,您可以保留bool来描述您的对象是否具有指定值。 -
您无法区分案例1和案例3,因为它们之间没有区别。在这两种情况下,您都有一个
shared_ptr,它拥有一个默认构造的Entity。
标签: c++ shared-ptr