문자 배열에 저장된 하위 수준 개체 주위에 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()
에 의해 반환 된 포인터는 유효하지 않습니다.
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());
달성하기 위해 어떤 방법이 있나요 : 나는 다음과 같은 코드가 유효하므로 부모 개체에 대한 참조를 개최한다 스마트 포인터의 일종을 반환 getString()
및 getSubstring()
수있는 방법을 가지고 같은 것 이 표준 C++ 기능을 사용합니까? 그렇지 않다면 Boost는 어떻습니까? "
#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));
}
};