170 похожих чатов

Привет :) #include <iostream> class StringWrapper { const char*

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' };
}

Создал враппер для строки, но не очень понимаю, как его правильно чистить - если мы передаёт значения строки, находящейся в стеке, то её удалять не нужно, а если в куче, то нужно. Что мне нужно написать в деструкторе? :)

15 ответов

11 просмотров

а ты что хочешь получить?

disba1ancer
а ты что хочешь получить?

Не понимаю, как освобождать память от строки Например: auto* heap = new StringWrapper(new const char[6] { 'H', 'e', 'l', 'l', 'o', '\0'}); delete heap; // m_String в heap всё ещё в памяти Здесь нужно удалять m_String в деструкторе, но здесь: StringWrapper stack = "Hello"; Этого делать не нужно, потому что строка в стеке

тебе надо определиться владеющий ты враппер или нет, если владеющий, то копируй в себя и удаляй в деструкторе, если невладеющий, вообще не трогай тему удаления, просто храни указатель

Анатолий Фролов (anafro)
Не понимаю, как освобождать память от строки Напри...

спрошу иначе, как ты в итоге хочешь этим пользоваться? какой синтаксис ты хочешь получить?

Анатолий Фролов (anafro)
Спасибо) Да, лучше копировать, думаю

посмотри в сторону std::string_view: https://en.cppreference.com/w/cpp/string/basic_string_view

Анатолий Фролов (anafro)
Почему?

потому как исчерпывающего пояснения нет, мне трудно поверить в то, что ты знаешь чего хочешь

disba1ancer
потому как исчерпывающего пояснения нет, мне трудн...

Объект, хранящий строку. Да, конечно, уму не постижимо понять))

Анатолий Фролов (anafro)
Объект, хранящий строку. Да, конечно, уму не пости...

на будущее, подчеркивай намерения в сигнатуре: // функция принимающая владение указателем 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")';

Anatoly Shirokov
на будущее, подчеркивай намерения в сигнатуре: // ...

по этим двум перегрузкам тогда можно будет различить, когда надо освобождать память в деструкторе, а когда нет

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта