指向智能指针管理数组中的智能指针 >我正在写一个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)); } }; 有没有办法使用标准C++功能实现这一点?如果没有,那么Boost呢

指向智能指针管理数组中的智能指针 >我正在写一个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)); } }; 有没有办法使用标准C++功能实现这一点?如果没有,那么Boost呢,c++,c++11,smart-pointers,C++,C++11,Smart Pointers,更新 根据雅克的建议,这里有一个版本似乎可以工作(当使用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

更新

根据雅克的建议,这里有一个版本似乎可以工作(当使用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));
    }
};
#包括
#包括
#包括
使用boost::shared\u ptr;
使用boost::从\u this启用\u shared\u;
阶级
String:public enable_shared_from_this
{
尺寸透镜;
char*s;
受保护的:
字符串(const char*str):len(std::strlen(str)),s(新字符[len]){
复制(str,str+len,s);
}
公众:
~String(){
删除s;
}
共享ptr
getString(){
返回shared_ptr(shared_from_this(),s);
}
共享ptr
getSubstr(大小\u t idx){
if(idx
您可能需要
共享\u ptr
的“别名”构造函数

如果您有C++1z支持,您甚至可以获得
[]

你的“某物”只是
共享的\u ptr

std::shared_ptr<char>
getSubstr(size_t idx) {
    if (idx < len)
        return {shared_from_this(), &s[idx]};
    else
        return {};
}

字符串(常量字符*str){
len=std::strlen(str);
s=std::shared_ptr(新字符[len],std::default_deleter{});
std::strcpy(s.get(),str);
}
std::共享的ptr
getSubstr(大小\u t idx){
if(idx
此策略的优点是
String
不需要由共享ptr管理——您可以将其粘贴在向量中或在堆栈上声明。C++在规则类型上蓬勃发展。

同时,内部缓冲区是智能指针管理的,因此子字符串不能悬空

其核心是别名构造函数。共享指针有两个组件:引用计数块和数据指针

参考计数块具有强计数、弱计数和销毁功能


别名构造函数允许您使用不同共享指针的引用计数块和任意数据指针。这是为了将共享指针返回到由共享指针管理的类的成员,这基本上就是您正在执行的操作。

您可能需要
共享\u ptr
的“别名”构造函数

如果您有C++1z支持,您甚至可以获得
[]

你的“某物”只是
共享的\u ptr

std::shared_ptr<char>
getSubstr(size_t idx) {
    if (idx < len)
        return {shared_from_this(), &s[idx]};
    else
        return {};
}

字符串(常量字符*str){
len=std::strlen(str);
s=std::shared_ptr(新字符[len],std::default_deleter{});
std::strcpy(s.get(),str);
}
std::共享的ptr
getSubstr(大小\u t idx){
if(idx
此策略的优点是
String
不需要由共享ptr管理——您可以将其粘贴在向量中或在堆栈上声明。C++在规则类型上蓬勃发展。

同时,内部缓冲区是智能指针管理的,因此子字符串不能悬空

其核心是别名构造函数。共享指针有两个组件:引用计数块和数据指针

参考计数块具有强计数、弱计数和销毁功能

别名构造函数允许您使用不同共享指针的引用计数块和任意数据指针。这是为了将共享指针返回给由共享指针管理的类的成员,这基本上就是您正在做的事情

std::shared_ptr<char> s;
String(const char* str) {
    len = std::strlen(str);
    s = std::shared_ptr<char>(new char[len], std::default_deleter<char[]>{});
    std::strcpy(s.get(), str);
}

std::shared_ptr<char>
getSubstr(size_t idx) {
    if (idx < len)
        return {s, s.get()+idx};
    else
        return {};
}