使用时std::weak_ptr,最佳实践是使用std::shared_ptr该lock()方法访问相应的内容,如下所示:
std::weak_ptr<std::string> w;
std::shared_ptr<std::string> s = std::make_shared<std::string>("test");
w = s;
if (auto p = w.lock())
std::cout << *p << "\n";
else
std::cout << "Empty";
Run Code Online (Sandbox Code Playgroud)
如果我想使用三元运算符来简写它,则似乎是这样的:
std::cout << (auto p = w.lock()) ? *p : "Empty";
Run Code Online (Sandbox Code Playgroud)
将是有效的代码,但这不能编译。
是否可以将这种方法与三元运算符一起使用?
考虑以下示例类:
class Foo {
public:
void* const arr_;
Foo() = delete;
Foo(const size_t size, bool high_precision) :
arr_(Initialize(size, high_precision)) {};
template <typename T>
T* GetDataPointer() {
return (T* const)arr_;
}
private:
static void* Initialize(const size_t size, bool high_prec) {
if (high_prec) {
return new double[size];
}
else {
return new float[size];
}
}
};
Run Code Online (Sandbox Code Playgroud)
当我使用 创建指向 Foo 对象的共享指针时std::make_shared,我经常发现我初始化的数组数据显示未定义的行为/变得损坏。例如:
std::shared_ptr<Foo> sp_foo = std::make_shared<Foo>(Foo(3,false));
auto foo_data = sp_foo->GetDataPointer<float>();
foo_data[0] = 1.1;
foo_data[1] = 2.2;
foo_data[2] = 3.3;
std::cout << "First …Run Code Online (Sandbox Code Playgroud)