Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.13;
Скачать: CL | DM;

Вниз

Вопрос про си (компилятор 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
3-1149503412
stud
2006-06-05 14:30
2006.08.13
формирование отчета в квикрепорт


15-1153168738
ArtemESC
2006-07-18 00:38
2006.08.13
Программка


15-1153285437
syte_ser78
2006-07-19 09:03
2006.08.13
Пользывался кто сервисом?


15-1153054691
The Only
2006-07-16 16:58
2006.08.13
сумма квадратов натуральных чисел от 1 до n


2-1153833875
Homo Sapiens
2006-07-25 17:24
2006.08.13
Проблема с реестром