shared_ptr空指针和赋值
shared_ptr null pointer and assignment
我想使用shared_ptr就像使用实际指针一样。我希望能够做这样的事情
shared_ptr<int> a;
a = new int(5);
a = 0;
shared_ptr<int> foo()
return 0;
但默认情况下不实现。
我shared_ptr通过添加
template<class Y> void operator=( int i )
{
reset(i);
}
template<class Y> void reset(int i)
{
this_type(i).swap(*this);
}
template<class Y> void operator=( Y * p )
{
reset(p);
}
shared_ptr(int i): px(0), pn()
{
}
唯一的问题是,如果我做一个 = -1;它会编译并给我一个空指针,这应该不是问题,因为通常你不能为指针分配整数值。
所以我的问题是,这是实现这一点的正确方法,还是我忘记了可能导致应用程序崩溃的情况?因为无论我在哪里看,我看到的获取shared_ptr的 nullpointer 的唯一方法是调用默认构造函数,与 ptr = 0; 相比,它在代码中不是很优雅。
No.不要更改源。这样做是有原因的,非常聪明的人已经决定它的定义方式比你要编辑它的方式更好。
你所拥有的甚至没有意义。你不能为指针赋值一个整数,它们是两种不同的类型,但你已经给了它这样的语义。你说:"...这应该不是问题,因为通常你不能为指针分配整数值",但你在问题的顶部也说"我想使用shared_ptr就像我使用实际指针一样"。嗯,是哪个?因为将整数分配给指针以将它们设置为 null 与实际指针的距离尽可能远。
你需要退后一步,意识到你想要的并不总是最好的事情。您应该还原这些更改并正确使用该类。我不想刻薄,但这真的不是你想走的路;它很危险,有荒谬的语义,而且到处都是不可维护的。
shared_ptr实现了一个类似指针的接口,因此您可以使用*
和->
运算符。
默认构造的(空)shared_ptr在内部等于 nullptr,因此您无需担心显式分配它。 即
std::shared_ptr<int> sh;
std::cout << ( sh.get() == nullptr ) << std::endl;
// Or alternatively:
std::cout << ( sh == nullptr ) << std::endl;
此外,(在我看来)使用shared_ptr创建对象的最优雅方法是std::make_shared
函数。 这还有一个额外的好处,即在某些编译器中(至少在MSVC++上)效率略高,因为一些内部优化被称为"我们知道你住在哪里"的习惯用语。
#include <memory>
#include <string>
class foo
{
public:
foo(std::string s, int n) {}
};
int main()
{
auto p = std::make_shared<int>();
auto q = std::make_shared<foo>("hello", 2);
}
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 关于 c++ 函数中指针赋值的简单问题
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 赋值到类型和空大括号. 语法说明
- 通过 lambda 在空指针处赋值
- 从字符串数组打印其中一个字符串时出现空指针赋值错误
- 指向指针赋值的指针
- shared_ptr空指针和赋值
- 将指针赋值给指针(以及将指针传递给类)时使用delete的混淆
- 无效的转换?将const指针赋值给指针
- 我给一个指针赋值,它把自己空了
- 将const指针赋值给指针
- 是否应该将构造函数体中赋值的指针成员初始化为NULL ?
- 赋值包括指针的结构体
- 将此指针赋值给指针的右值引用
- 指针赋值与指针算术
- 如何将类对象赋值给指针
- 对象指针赋值的指针向量中的一个元素