m_String;
public:
StringWrapper(const char* string) : m_String(string) {}
~StringWrapper() {
// delete m_String; | ???
}
};
int main() {
StringWrapper stack = "Hello";
StringWrapper heap = new const char[6] { 'H', 'e', 'l', 'l', 'o', '\0' };
}
Создал враппер для строки, но не очень понимаю, как его правильно чистить - если мы передаёт значения строки, находящейся в стеке, то её удалять не нужно, а если в куче, то нужно. Что мне нужно написать в деструкторе? :)
а ты что хочешь получить?
Не понимаю, как освобождать память от строки Например: auto* heap = new StringWrapper(new const char[6] { 'H', 'e', 'l', 'l', 'o', '\0'}); delete heap; // m_String в heap всё ещё в памяти Здесь нужно удалять m_String в деструкторе, но здесь: StringWrapper stack = "Hello"; Этого делать не нужно, потому что строка в стеке
тебе надо определиться владеющий ты враппер или нет, если владеющий, то копируй в себя и удаляй в деструкторе, если невладеющий, вообще не трогай тему удаления, просто храни указатель
спрошу иначе, как ты в итоге хочешь этим пользоваться? какой синтаксис ты хочешь получить?
Спасибо) Да, лучше копировать, думаю
Обычный себе такой дата-враппер
что-то странное...
Почему?
посмотри в сторону std::string_view: https://en.cppreference.com/w/cpp/string/basic_string_view
потому как исчерпывающего пояснения нет, мне трудно поверить в то, что ты знаешь чего хочешь
Спасибо) Совсем забыл про вью
Объект, хранящий строку. Да, конечно, уму не постижимо понять))
допустим, а как ты собираешься с ним работать?
на будущее, подчеркивай намерения в сигнатуре: // функция принимающая владение указателем void foo(std::unique_ptr<char[]> ptr); // функция просто использующая указатель без передачи владения void foo(char[] ptr); пример: std::unique_ptr<char[]> buffer(new char[1024]); // явно передаем владение foo(std::move(buffer)); // просто передаем указатель для использования foo("1234567")';
по этим двум перегрузкам тогда можно будет различить, когда надо освобождать память в деструкторе, а когда нет
Обсуждают сегодня