【发布时间】:2016-10-09 12:58:30
【问题描述】:
我正在围绕存储在字符数组中的低级对象编写 C++ 包装器。我希望能够使用智能指针来管理我的班级的生命周期。我班的几个成员需要返回指向对象的指针;因为这些不是单独的分配,所以我不能为它们使用标准的智能指针,一旦主对象被释放,这些指针将变得无效。
为了具体起见,考虑以下简单的字符串类:
class
String
{
char* s;
size_t len;
protected:
String(const char* str) {
len = std::strlen(str);
s = new char[len];
std::strcpy(s, str);
}
public:
~String() {
delete s;
}
char*
getString() {
return s;
}
char*
getSubstr(size_t idx) {
if (idx < len)
return &s[idx];
else
return nullptr;
}
static std::shared_ptr<String>
makeString(const char* str) {
return std::shared_ptr<String>(new String(str));
}
};
我可以使用std::shared_ptr 管理String 的实例。但是当我的String 对象被破坏时,getString() 或getSubstring() 返回的任何指针都将无效。我希望让getString() 和getSubstring() 返回某种智能指针,该指针将持有对父对象的引用,因此以下代码有效:
std::shared_ptr<String> str = String::makeString("Hello world");
SOMETHING<char> substr = str->getSubstr(6);
std::printf("String: %s\n", str->getString());
str.reset();
std::printf("Substring: %s\n", substr.get());
有什么方法可以使用标准 C++ 功能实现这一点?如果没有,那么 Boost 呢?
更新
根据 Yakk 的建议,这是一个似乎可以工作的版本(使用 gcc 或 clang 编译为 C++11 时):
#include <cstring>
#include <boost/enable_shared_from_this.hpp>
#include <boost/shared_ptr.hpp>
using boost::shared_ptr;
using boost::enable_shared_from_this;
class
String : public enable_shared_from_this<String>
{
size_t len;
char* s;
protected:
String(const char* str) : len(std::strlen(str)), s(new char[len]) {
std::copy(str, str+len, s);
}
public:
~String() {
delete s;
}
shared_ptr<char[]>
getString() {
return shared_ptr<char[]>(shared_from_this(), s);
}
shared_ptr<char[]>
getSubstr(size_t idx) {
if (idx < len)
return shared_ptr<char[]>(shared_from_this(), s+idx);
else
return shared_ptr<char[]>();
}
static shared_ptr<String>
makeString(const char* str) {
return shared_ptr<String>(new String(str));
}
};
【问题讨论】:
标签: c++ c++11 smart-pointers