如何初始化对象的管理器 w/o 在 shared_ptr 中初始化对象?
How to initialize object's manager w/o initializing object in shared_ptr?
我想这样使用智能指针:
using namespace std;
shared_ptr<string> foo;
weak_ptr<string> bar (foo);
foo = make_shared<string>("some string");
cout << *bar.lock(); // SIGSEGV
线索是如何在不构造对象的情况下初始化 shared_ptr
的对象管理器(在本例中为 string
)。有可能吗?我可以使用对象的默认构造函数,然后使用 copy/move 赋值。但是否存在更优雅的解决方案?
对我来说,对象不会被初始化是值得的 - 如果我用空值初始化 shared_ptr,那将是逻辑上的谎言。
为什么不这样做:
shared_ptr<string> foo = make_shared<string>();
weak_ptr<string> bar (foo);
*foo = "some string":
这样你实际上是在共享一个字符串。你描述的更像是共享一个共享指针。
我解决了我的问题。这个思路的核心是使用嵌套指针:shared_ptr<unique_ptr<MYTYPE>>
。在我的例子中,我创建了一个包装模板:
template<typename T>
class LazyInitializator : public std::unique_ptr<T> {
public:
LazyInitializator() : std::unique_ptr<T>() {} // this ctor offers lazy initialization
LazyInitializator(const T& val) : std::unique_ptr<T> (std::make_unique<T>(val)) {} // for normal construction
LazyInitializator& operator= (const T& val) {
if (!std::unique_ptr<T>::operator bool()) // if object wasn't constructed
std::unique_ptr<T>::operator= (std::make_unique<T>(val)); // construct it
**this = val; // use assingment op provided by T - no unneccessary mem allocation
return *this;
}
};
多亏了它,我可以更轻松地使用 shared_ptr
s。我可以这样做:
using namespace std;
shared_ptr<LazyInitializator<string>> foo = make_shared<LazyInitializator<string>>();
weak_ptr<LazyInitializator<string>> bar (foo);
*foo = "some string";
cout << **bar.lock();
是的,我知道,看起来有点棘手,但它现在对我来说是最好的解决方案。
我想这样使用智能指针:
using namespace std;
shared_ptr<string> foo;
weak_ptr<string> bar (foo);
foo = make_shared<string>("some string");
cout << *bar.lock(); // SIGSEGV
线索是如何在不构造对象的情况下初始化 shared_ptr
的对象管理器(在本例中为 string
)。有可能吗?我可以使用对象的默认构造函数,然后使用 copy/move 赋值。但是否存在更优雅的解决方案?
对我来说,对象不会被初始化是值得的 - 如果我用空值初始化 shared_ptr,那将是逻辑上的谎言。
为什么不这样做:
shared_ptr<string> foo = make_shared<string>();
weak_ptr<string> bar (foo);
*foo = "some string":
这样你实际上是在共享一个字符串。你描述的更像是共享一个共享指针。
我解决了我的问题。这个思路的核心是使用嵌套指针:shared_ptr<unique_ptr<MYTYPE>>
。在我的例子中,我创建了一个包装模板:
template<typename T>
class LazyInitializator : public std::unique_ptr<T> {
public:
LazyInitializator() : std::unique_ptr<T>() {} // this ctor offers lazy initialization
LazyInitializator(const T& val) : std::unique_ptr<T> (std::make_unique<T>(val)) {} // for normal construction
LazyInitializator& operator= (const T& val) {
if (!std::unique_ptr<T>::operator bool()) // if object wasn't constructed
std::unique_ptr<T>::operator= (std::make_unique<T>(val)); // construct it
**this = val; // use assingment op provided by T - no unneccessary mem allocation
return *this;
}
};
多亏了它,我可以更轻松地使用 shared_ptr
s。我可以这样做:
using namespace std;
shared_ptr<LazyInitializator<string>> foo = make_shared<LazyInitializator<string>>();
weak_ptr<LazyInitializator<string>> bar (foo);
*foo = "some string";
cout << **bar.lock();
是的,我知道,看起来有点棘手,但它现在对我来说是最好的解决方案。