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

Здравствуйте! Подскажите, пожалуйста: 1. Вот такой код сегфолтится: SomeClass *pointer = new

SomeClass(..xx..); //just initialization

while (...) {
if(pointer) delete pointer;
pointer = new SomeClass(..yy..);
...
}
delete pointer;

2. А вот такой код:

SomeClass *pointer = new SomeClass(..x....); // just initialization

while(...) {
SomeClass *pointer = new SomeClass(..y....);
}
delete pointer;

Работает и даже память не течет. Вопрос почему это так?

40 ответов

21 просмотр

у меня такой код не сегфолтится int *pointer = new int(1); //just initialization if(pointer) delete pointer; pointer = new int(1); delete pointer;

Весь код можно увидеть из 1 пункта?

Roy Mustang
Весь код можно увидеть из 1 пункта?

А, ты уже смотришь, расскажи потом тогда

Wouf- Автор вопроса
Roy Mustang
Весь код можно увидеть из 1 пункта?

HepMC::GenVertex *sub_vertices = new HepMC::GenVertex(HepMC::FourVector(0, 0, 0, 0), 0); // just initialization while (ihy < hj2->GetNtot()) { if ((hj2->GetiJet().at(ihy)) != isub_l) { if(sub_vertices) delete sub_vertice; sub_vertices = new HepMC::GenVertex(HepMC::FourVector(0, 0, 0, 0), hj2->GetiJet().at(ihy)); Да, возможно вопрос сложнее, чем я думал. Или нужен прямо совсем весь код?

Wouf
HepMC::GenVertex *sub_vertices = new HepMC::GenVe...

Скинь на pastebin код (функцию) и ссылку скинь или ты можешь сам в отладчике пошагово пройтись и посмотреть выполняются ли ветки как задуманно, а вообще, используй unique_ptr если не хочешь утечек памяти

Wouf- Автор вопроса
Roy Mustang
Скинь на pastebin код (функцию) и ссылку скинь или...

Код есть на GitHub, но он огромен. Наверное мой вариант через unique_ptr, спасибо за совет!

Кто ж знает-то? можно определённо сказать одно: Один кусок кода более правильный , другой -неправильный.

Wouf- Автор вопроса
Ilya Zviagin
Кто ж знает-то? можно определённо сказать одно: Од...

И какой не правильный? Если 2., то почему компилятор и llvm-analyzer не ругаются?

Ты прислал два отрывка кода. Даже не так - два обрывка кода. Ты реально думаешь, что возможно оценить их правильность?

Wouf
И какой не правильный? Если 2., то почему компилят...

Попробуй скормить этим два куска твоим анализаторам, что они скажут?

Wouf
И какой не правильный? Если 2., то почему компилят...

Для таких ситуаций существуют отладчики. Если не умеете ими пользоваться - научитесь: однозначно пригодится.

Wouf- Автор вопроса
Ilya Zviagin
Попробуй скормить этим два куска твоим анализатора...

А ничего, не ругаются в том смысле, что память не течет

Wouf
А ничего, не ругаются в том смысле, что память не ...

Я не про это. А про то, что такой обрывок, ещё и с удалёнными частями, невозможно анализировать.

Wouf- Автор вопроса
Ilya Zviagin
Я не про это. А про то, что такой обрывок, ещё и с...

Да, я понял, спасибо. Буду с поведением фреймворка разбираться.

while(...) { SomeClass *pointer = new SomeClass(..y....); } delete pointer; // вот этот pointer — это другой pointer, другая переменная с тем же именем, нежели переменная в цикле. Она ни в коем случае не удалит ничего, на что ссылается переменная с именем pointer в цикле. Это ожидаемое тобой поведение ? Ты на это рассчитывал?

Wouf- Автор вопроса
Ilya Zviagin
while(...) { SomeClass *pointer = new SomeCl...

В этом и был вопрос: почему компилятор не ругаться на редекларацию, и почему llvm-analyzer не видит утечки памяти тут

Wouf- Автор вопроса
Ilya Zviagin
который фреймворк кстати?

Внутренний корпоративный

Wouf
В этом и был вопрос: почему компилятор не ругаться...

Я не могу оценить есть ли там утечка памяти

Wouf
В этом и был вопрос: почему компилятор не ругаться...

А ты если утечки ищешь, то использовал бы тут unique_ptr, и всё бы автоматом освобождалось.

Wouf- Автор вопроса
Wouf- Автор вопроса
Ilya Zviagin
А ты если утечки ищешь, то использовал бы тут uniq...

Собственно пора уже привыкать жить без new/delete

Wouf
Собственно пора уже привыкать жить без new/delete

Ну, по тому коду что ты показал, там вообще не надо было бы создавать объекты динамически...

Wouf- Автор вопроса
Ilya Zviagin
Ну, по тому коду что ты показал, там вообще не над...

Почему? Конструктор запускается с разными вводными... Вне цикла инициализация по-умолчанию, в цикле - условная

Wouf
Почему? Конструктор запускается с разными вводными...

Потому что ты объект тут же удаляешь. Это значит, что время жизни обьекта строго определено.

Wouf- Автор вопроса
Ilya Zviagin
Потому что ты объект тут же удаляешь. Это значит,...

Там ещё условие, т. ч. объект может жить несколько циклов

Wouf
Собственно пора уже привыкать жить без new/delete

Да с ними уже лет 20 в C++ никто и не живет, кроме тех случаев, когда фреймворк (например, Qt) не берет на себя GC

Wouf- Автор вопроса
Anatoly Shirokov
Да с ними уже лет 20 в C++ никто и не живет, кроме...

Старые коды переписываются медленно... Да и auto_ptr работало не очень (при копировании)

Wouf
Старые коды переписываются медленно... Да и auto_p...

Не то чтобы не очень, оно работало по стандарту и было не Copyable

Wouf
Старые коды переписываются медленно... Да и auto_p...

Ты лучше расскажи, когда тебя заморозили? Разморозка недавно была, это понятно.

Wouf- Автор вопроса
Anatoly Shirokov
Не то чтобы не очень, оно работало по стандарту и ...

Вот поэтому в больших и сложных проектах особого желания отказываться от new/delete не было

Wouf
Вот поэтому в больших и сложных проектах особого ж...

Повторю, что использовать неуправляемые raw указатели в C++ - это говорит о качестве "большого проекта"

Wouf
Вот поэтому в больших и сложных проектах особого ж...

Нестандартных и своих смарт указателей было выше крыши

Anatoly Shirokov
Повторю, что использовать неуправляемые raw указат...

Ну хрен знает, всякие графы, двух связанные списки без raw не реализуешь

Anatoly Shirokov
Повторю, что использовать неуправляемые raw указат...

Использовать raw указатели или владеющие raw указатели?)

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
3
Карта сайта