如何为std::unique_ptr分配任意内存地址而非构造对象?
能否为std::unique_ptr分配任意值?
不能直接像你示例里的pObj = 1;那样给std::unique_ptr分配任意整数,因为标准的std::unique_ptr没有提供接受整数类型的赋值运算符,这样写会直接编译失败。
不过针对你的测试需求(让unique_ptr非空但不构造实际对象),有两种可行的方法:
方法一:使用自定义空删除器
你可以给std::unique_ptr指定一个什么都不做的删除器,这样就能将任意非空的无效指针赋值给它,且不会在析构时尝试释放内存:
// 定义一个空删除器,析构时不做任何操作 struct NullDeleter { void operator()(someObj*) const noexcept {} }; // 声明带空删除器的unique_ptr,并传入转换后的非空指针 std::unique_ptr<someObj, NullDeleter> pObj(reinterpret_cast<someObj*>(0x1)); assert(pObj); // 断言会成功,因为get()返回的不是nullptr
注意:绝对不能对这个指针做解引用操作(比如*pObj或pObj->func()),因为它指向的是无效内存,这么做会触发未定义行为,只能用来判断指针是否非空。
方法二:使用指向静态存储的空对象(备选)
如果你能接受构造一个极简的空对象(比如类里没有复杂成员),可以用一个静态存储的对象地址来初始化unique_ptr,同样不需要动态分配:
static someObj dummyObj; std::unique_ptr<someObj> pObj(&dummyObj); assert(pObj);
不过这种方法需要确保unique_ptr不会尝试删除这个静态对象,所以你可能还是需要配合空删除器,或者在测试结束前手动释放指针所有权:
pObj.release(); // 释放所有权,避免析构时删除静态对象
内容的提问来源于stack exchange,提问作者Ulli
相关产品推荐
相关产品推荐

