LINUX.ORG.RU

double free or corruption

 


0

2
ioid::~ioid()
{
  if (msglen != -1 && msgbuf != NULL)
    delete msgbuf;
  msglen = -1;
  msgbuf = NULL;
}

выдает ошибку на delete.

Что это может быть?

в других местах я память не освобождаю

UPD: Все, разобрался, ошибка была совсем детской.

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 3)

Ответ на: комментарий от anonymous

Хотя говно.

Покажи весь код и stacktrace

anonymous
()

Слишком мало кода чтобы что-то можно было утверждать. Где прототип объекта хотя бы?

KblCb ★★★★★
()

Проверка на нул не нужна. И вообще

class ioid ... {
...
    std::unique_ptr<...> msgbuf;
...
};
anonymous
()

Все, разобрался, ошибка была совсем детской.

Рассказывай, что за ошибка была? Вдруг другим поможет!

trex6 ★★★★★
()

~ioid()
delete msgbuf
выдает ошибку на delete.

ссзб. надо так:

template <typename T>
class ioid
{
  std::unique_ptr <T []> msgbuf_ref;
  T *msgbuf;
  size_t msglen;
  

  public:
    ioid() : msgbuf_ref(), msgbuf(msgbuf_ref.get()), msglen(0) {}
    void resize_msg_naprimer(size_t t) {
       msgbuf_ref.reset(new T [t]);
       msgbuf = msgbuf_ref.get();
       msglen = t;
    }
};

делиты не нужны. деструкторы здесь тоже.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)

в других местах я память не освобождаю

зато наверное пишешь куда не положено

Harald ★★★★★
()
Ответ на: комментарий от trex6

Я сперва выделил память, затем скопировал всю переменную типа ioid, затем вышел из функции (и тут память очистилась в первый раз), а затем стал освобождать и копию.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от nanoolinux

А нужно

MPI_Send(msgbuf, msglen, MPI_DOUBLE, server_id, GD_POSKAS, MPI_COMM_WORLD);

Особенность MPI в том, что требуется именно массив в смысле C или фортрана. Остальные массивы могут и не заработать.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Особенностью std::vector является то, что он именно массив в смысле С или фортрана.

Остальные массивы могут и не заработать.

nOOb.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от cvs-255

Я сперва выделил память, затем скопировал всю переменную типа ioid, затем вышел из функции (и тут память очистилась в первый раз), а затем стал освобождать и копию.

А ты уверен, что тут должен быть delete, а не delete[]? Ну и про умные указатели и вектор уже сказали.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

Особенностью std::vector является то, что он именно массив в смысле С или фортрана.

Это в спецификации так написано, или «ну так оно внутри устроено»?

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Just like arrays, vectors use contiguous storage locations for their elements, which means that their elements can also be accessed using offsets on regular pointers to its elements, and just as efficiently as in arrays. But unlike arrays, their size can change dynamically, with their storage being handled automatically by the container.

Гуголь занёс тебя в чёрный список? За что?

nanoolinux ★★★★
()

Не понятно, зачем тебе тут проверка длины.

if(msgbuf)
{
    delete[] msgbuf;
    msgbuf = NULL;
}

а лучше макросы завести

#define safe_delete(ptr) do if(ptr) { delete ptr; ptr = NULL; } while(0)
#define safe_delete_array(ptr) do if(ptr) { delete[] ptr; ptr = NULL; } while(0)

anonymous
()
Ответ на: комментарий от DarkEld3r

Не хочешь, не проверяй. Никто не заставляет. Я лично не вижу смысла в выполнении двух операторов когда в этом нет необходимости.

anonymous
()
Ответ на: комментарий от anonymous

хочешь, не проверяй. Никто не заставляет. Я лично не вижу смысла в выполнении двух операторов когда в этом нет необходимости.

С таким идиотским подходом, ты можешь написать так:

if (msgbuf != NULL)
  if (msgbuf != NULL)
    if (msgbuf != NULL)
      if (msgbuf != NULL)
        delete msgbuf;

тогда когда в этом нет необходимости не будет выполняться ещё больше операторов!

Габровец приехал в Софию к сыну, который учился в училище, а тот хвалится:
– Папа, сегодня я сэкономил два лева!
– Великолепно, сынок, но как тебе удалось сэкономить?
– Сегодня утром я не сел в трамвай, а чтобы не опоздать на занятия, бежал за трамваем до училища.
– Балбес! – отругал его отец. – Ты что не мог бежать за каким-нибудь такси, чтобы сэкономить больше?
slovazap ★★★★★
()
Ответ на: комментарий от slovazap

[наркомане_моде]

кстати, делит сам на ноль проверяет ещё, так что одну проверку можно убрать:

if (msgbuf != NULL)
  if (msgbuf != NULL)
    if (msgbuf != NULL)
      //if (msgbuf != NULL)
        delete msgbuf;
[/наркомане_моде]

nanoolinux ★★★★
()

(тред не читал) Продолбал закрыть или определить оператор копирования и копирующий конструктор, да?

Юзай std::shared_ptr, если копирование нужно, и std::unique_ptr, если нет.

И да, по твоему коду: delete для NULL разрешен и не делает ничего. Так что

 if (msglen != -1 && msgbuf != NULL)
Сокращается до
 if (msglen != -1)

Да и вообще проверки в деструкторе сомнительны в своей нужности.

Pavval ★★★★★
()
Ответ на: комментарий от slovazap
if (msgbuf != NULL)
  if (msgbuf != 0)
    if (msgbuf != false)
      if (msgbuf != nullptr)
        if (msgbuf != (void *)0)
           delete msgbuf;

А то мало ли что...

Kosyak ★★★★
()
Ответ на: комментарий от slovazap

С таким идиотским подходом, ты можешь написать так:

но написал ты. Можешь с уверенностью считать себя идиотом.

anonymous
()
Ответ на: комментарий от cvs-255

К.О. также напоминает, что кроме std::vector существует более брутальный std::valarray - как раз для всяких ваших MPI, Си и прочих фортранов)

asaw ★★★★★
()
Ответ на: комментарий от asaw

Твой КО опа читал?

Я сперва выделил память, затем скопировал всю переменную типа ioid, затем вышел из функции (и тут память очистилась в первый раз), а затем стал освобождать и копию.

Из кода неявно видно, что это простой байтовый буфер, а не коллекция объектов.

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Твой КО опа читал?

зачем всего то? он читал тебя, который писал:

(тред не читал)

тащем-то кэп обобщает.

asaw ★★★★★
()

Проверка на msgbuf != NULL лишняя.
Где до до деструктора вы делаете delete msgbuf или где то до delete портится память.
В любом случае valgrind вам не помешает.

andreyu ★★★★★
()
Ответ на: комментарий от Redrum

В чем профит обнулять данные в деструкторе?

Ну может msglen и msgbuf статиком сделаны.

andreyu ★★★★★
()
Ответ на: комментарий от Pavval

В контексте этого топика - это вряд-ли была причина проблемы.

Ну да. Но я всё равно не понял смысл замечания, которое (на мой взгляд) выглядит как «можно всегда использовать простой delete».

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Я говорил в контесте «в данном случае дело не в этом».

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.