Почему падает на delete
От: dosik Россия www.dosik.ru
Дата: 07.06.08 10:18
Оценка:
Вот сам код:

    char* pSendAck = new char[1024];
    ZeroMemory(pSendAck, 1024);

    u_short* pShortValue = reinterpret_cast<u_short*>(pSendAck);
    *pShortValue = htons(0x06);

    char* pCharValue = pSendAck;;
    pCharValue += 2;
    strcpy_s(pCharValue, 1024, "blksize");
    ++(pCharValue = strrchr(pCharValue, 0));
    _itoa_s(Session.blksize, pCharValue, 1024, 10);
    ++(pCharValue = strrchr(pCharValue, 0));
    strcpy_s(pCharValue, 1024, "tsize");
    ++(pCharValue = strrchr(pCharValue, 0));
    _ui64toa_s(Session.tsize.QuadPart, pCharValue, 1024, 10);
    ++(pCharValue = strrchr(pCharValue, 0));

    int FrameSize = static_cast<int>(pCharValue - pSendAck);
    int bytesSend = send(Session.ClientSock, pSendAck, FrameSize, 0);
    delete[1024] pSendAck;


На последней строчке программа падает. Что не так, не могу понять...
Re: Почему падает на delete
От: Lorenzo_LAMAS  
Дата: 07.06.08 10:21
Оценка:
А надо так

delete [] ptr;
Of course, the code must be complete enough to compile and link.
Re: Почему падает на delete
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 07.06.08 10:23
Оценка: +1
Здравствуйте, dosik, Вы писали:

D>Вот сам код:


D>
D>    delete[1024] pSendAck;
D>


Нужно просто delete [] pSendAck.

D>На последней строчке программа падает. Что не так, не могу понять...


Не могу понять как у вас такое вообще скомпилилось? У меня g++ такой компилить не стал:

delete.cc:4: ошибка: expected `]' before numeric constant
delete.cc:4: ошибка: type ‘int’ argument given to ‘delete’, expected pointer
delete.cc:4: ошибка: expected `;' before ‘]’ token

Re: Почему падает на delete
От: carpenter Голландия  
Дата: 07.06.08 10:24
Оценка:
Здравствуйте, dosik, Вы писали:
в код не вникал (может куча попорчена) ... но может так —
delete [] pSendAck;
Весь мир — Кремль, а люди в нем — агенты
Re[2]: Почему падает на delete
От: dosik Россия www.dosik.ru
Дата: 07.06.08 10:31
Оценка:
Здравствуйте, carpenter, Вы писали:

C>Здравствуйте, dosik, Вы писали:

C>в код не вникал (может куча попорчена) ... но может так —
C>delete [] pSendAck;

Согласен. Исправил. Все равно падает...
Re[3]: Почему падает на delete
От: JLO  
Дата: 07.06.08 10:52
Оценка: +1
Здравствуйте, dosik, Вы писали:

D>Согласен. Исправил. Все равно падает...


Нельзя ж всё время подавать размер массива 1024 если его начало двигаешь.
Re: Почему падает на delete
От: Alexander G Украина  
Дата: 07.06.08 11:15
Оценка:
Здравствуйте, dosik, Вы писали:

D>Вот сам код:


D>[ccode]

D> char* pSendAck = new char[1024];
D> ZeroMemory(pSendAck, 1024);

D> u_short* pShortValue = reinterpret_cast<u_short*>(pSendAck);

D> *pShortValue = htons(0x06);

D> char* pCharValue = pSendAck;;

D> pCharValue += 2;
D> strcpy_s(pCharValue, 1024, "blksize");
D> ++(pCharValue = strrchr(pCharValue, 0));
D> _itoa_s(Session.blksize, pCharValue, 1024, 10);
...

D>На последней строчке программа падает. Что не так, не могу понять...


Для strcpy_s неверно указывается размер буфера.
Заменить на strcpy или вместо 1024 подставлять реальный размер (тот что остался а не тот что был).
Русский военный корабль идёт ко дну!
secure crt
Re[4]: Почему падает на delete
От: Кодт Россия  
Дата: 07.06.08 13:09
Оценка:
Здравствуйте, JLO, Вы писали:

JLO>Нельзя ж всё время подавать размер массива 1024 если его начало двигаешь.

Нужно вместо 1024 во всех _s-функциях писать
char* pEnd = pSendAck + 1024;
.....
_s(..., pEnd-pCharValue, ...);



А ещё можно было не городить огород, а написать в одну строку
int bytes = _sprintf_p(pSendAck, 1024,
    "%c%c" "blksize%c" "%d%c" "tsize%c" "%I64u%c", // это всё одна строка, элементы которой я разделил для наглядности
    0,6, // htons(0x0006)
    0, // концевые нули приходится впечатывать, поскольку форматная строка сама не может быть мультистрингом
    Session.blksize, 0,
    0,
    Session.tsize.QuadPart, 0
    );
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Почему падает на delete
От: dosik Россия www.dosik.ru
Дата: 07.06.08 13:15
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Для strcpy_s неверно указывается размер буфера.

AG>Заменить на strcpy или вместо 1024 подставлять реальный размер (тот что остался а не тот что был).

Согласен. Спасибо...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.