Форум: "Прочее";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];
ВнизВопрос про си (компилятор MVC дот нет он же визуал студио 2005) Найти похожие ветки
← →
Servelat © (2006-07-15 01:22) [0]Писал прогу, словил ошибку с выделением памяти. Ну ладно думаю, ошибся, и в дельфе бывало... Но ошибка так и не пофиксилась несмотря на все мои трехкратные проверки и т.д. и т.п. В результате, я написал маленькую тестовую программу и так и не могу понять где в ней ошибка. Или это особенность данного компилятора? Итак, создаем пустой (Empty) консольный проект, создаем один модуль (main.cpp у меня), и туда постим нижеследующий код. Все настройки по дефолту, (соответственно, конфигурация Debug Win32).
#include <iostream>
#include <memory.h>
#include <malloc.h>
#include <stdio.h>
using namespace std;
void main()
{
unsigned long c = 100;
unsigned char *p = (unsigned char *)malloc(c);
memset(p, rand()%256, 100);
for (int i=0; i<50; i++)
{
unsigned char *d = (unsigned char *)malloc(100);
memset(d, rand()%256, 100);
c+=100;
realloc(p, c); //X
memcpy(p+c-100, d, 100); //X
free(d);
}
unsigned char *d;
for (d = p; d - p < c; d+=100)//X
cout << *d << "\n";//X
system("PAUSE");
}
если строчки, помеченные иксами закомментировать, то все работает нормально =). Но как так, реаллок что ли кривой? Вроде в последнюю очередь на компилятор плохо думать, но уже и не знаю что предположить...
Да, сама ошибка такого вида (runtime):
Windows has triggered a breakpoint in lolotester11.exe.
This may be due to a corruption of the heap, and indicates a bug in lolotester11.exe or any of the DLLs it has loaded.
The output window may have more diagnostic information.
Появляется при первом вызове free.
WinXp.
← →
Servelat © (2006-07-15 01:28) [1]Да, и еще.
Если включить конфигурацию Release Win32 и запускать не из среды MVC, то ошибка вырождается в Acess Violation. Что не меняет вопроса: "че за нафик?" =).
← →
Шпиён (2006-07-15 02:22) [2]
p = (unsigned char *)realloc(p, c);
← →
isasa © (2006-07-15 10:58) [3]
free(d);
}
unsigned char *d; // <- А выделить память указателю?
for (d = p; d - p < c; d+=100)//X
← →
Шпиён (2006-07-15 11:42) [4]
> isasa © (15.07.06 10:58) [3]
Этот кусочек кода совершенно не при чём -)
unsigned char *d;
for (d = p; d - p < c; d+=100)
cout << *d << "\n";
У автора - теряется указатель на перераспределенную память
MSDN:
void *realloc(
void *memblock,
size_t size
);
realloc returns a void pointer to the reallocated (and possibly moved) memory block.
← →
isasa © (2006-07-15 11:45) [5]Шпиён (15.07.06 11:42) [4]
После исправления первого, воткнется во второе.
← →
Шпиён (2006-07-15 11:51) [6]
> isasa © (15.07.06 11:45) [5]
Не воткнется. Не веришь - проверь отладчиком. -)
В следующей строкеfor (d = p;....
переменной d приваивается значение указателя p , а дальше - обычная адресная арифметика.
← →
isasa © (2006-07-15 11:55) [7]Все, увидел. :)
← →
Шпиён (2006-07-15 11:58) [8]
> Шпиён (15.07.06 11:51) [6]
"Воткнутся" во что-либо может только в случае выхода за границы выделенной (p) памяти.
← →
Servelat © (2006-07-15 12:24) [9]все, дошло =). блин, я ведь читал MSDN по етому делу, как же пропустил. сенькс.
← →
Desdechado © (2006-07-15 19:25) [10]ключевое слово possibly moved)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.044 c