Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1153765656
AlexeyT
2006-07-24 22:27
2006.08.13
Как узнать все размеры шрифта?


15-1153306535
Prohodil Mimo
2006-07-19 14:55
2006.08.13
Есть ли Skype-плагин к Миранде?


2-1153524835
Батыр
2006-07-22 03:33
2006.08.13
Размер папки


8-1140421786
DVM
2006-02-20 10:49
2006.08.13
Wavelet - сжатие изображений.


15-1152854597
tButton
2006-07-14 09:23
2006.08.13
первый





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский