Страница: 1 | 2 |
Вопрос: VS2003 и C(без ++)
Добавлено: 18.02.06 18:22
Автор вопроса: vito | Web-сайт:
VS2003 и C(без ++)
Вот простой пример создания двумкрного динамического массива на С (без +). Компиляция в С код.
int main(int argc, char* argv[])
{
int **a;
int n=3,m=3,i;
/* -------- распределение памяти -------- */
a=(int **)calloc(m,sizeof(int *));
for (i=0; i<=m; i++)
a[i]=(int *)calloc(n,sizeof(int));
/* --------- проверка ----------*/
a[1][0]=5;
a[1][1]=10;
printf ( " Calloc memory : ");
printf ("%d\n", a[1][1]);
printf ( " Calloc memory : ");
printf ("%d\n", a[1][0]);
/* --------- освобождение памяти ----------*/
for (i=0; i<=m; i++)
free (a[i]);
/* Студия глючит в этом месте. Приходится убирать этот оператор.Но где гарантия что память освобождена? */
free (a);
/* --------- проверка ----------*/
printf ( " Free memory : ");
printf ("%d\n", a[1][1]);
printf ( " Free memory : ");
printf ("%d\n", a[1][0]);
scanf("%d",&i);
return 0;
}
//---------------------------------------------------------------------------
Borland компилит без проблем. Студия, то не может скомпилить, то выкидывает исключение - пользовательский бряк, то вообще ведет себя непонятно.:))
В конечном счете экзешник получается, но что за ерунда?
Если убрать free (a); - то все нормально.
Ответы
Всего ответов: 24
Номер ответа: 1
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #1
Добавлено: 18.02.06 22:38
у меня кста двухмерные динамические тоже в студии всегда глючили, и
через malloc, и через new...
Номер ответа: 2
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #2
Добавлено: 18.02.06 23:20
Млин, это ,что особенность реализации)
Номер ответа: 3
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #3
Добавлено: 18.02.06 23:52
нафиг эти малоки, цалоки, и прочие новые.
Есть же VirtualAlloc/VirtualFree, что ещё надо для полного счастья?
Номер ответа: 4
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #4
Добавлено: 19.02.06 00:02
HOOLIGAN
Ды привык уже, стараюсь где это только возможно не привязываться к API.
Фиг знает, что MS выкинет, переписывать все что -ли?
Номер ответа: 5
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #5
Добавлено: 19.02.06 00:18
Да и потом криво это, стандарт все - таки. Сорцы разные попадаются, и очень древниие тоже.
Номер ответа: 6
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #6
Добавлено: 19.02.06 01:04
vito
Какой стандарт? Что есть допустим new? Криво обёрнутый HeapAlloc при малых размерах заказываемой памяти и VirtualAlloc при больших.
К чему тогда нужна кривая оболочка new? Та же хрень с malloc - это вообще глючило ещё то.
crt ведь не работает напрямую с железом, обращается к апи.
Номер ответа: 7
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #7
Добавлено: 19.02.06 02:08
HOOLIGAN
Скорее наоборот, только malloc и calloc, про new молчим.
Кстати new не глючит.
На С все это написано, и осмелюсь предположить, что без маллоков и каллоков не обошлось
Хотя хрен их знает
А С - стандартизирован, причем давно, и компилятор обязан отвечать стандарту.
З.Ы. Вот сейчас нарыл хорошую, но старую прогу с сорцами (жмет звук). Мне ее что переписывать?
Лучше на борланде проект сделаю???
Номер ответа: 8
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #8
Добавлено: 19.02.06 02:39
Как-то нарвался на new, с тех пор как отрезало - никаких "С-стандартов". Нахрен!
VirtualAlloc работает безупречно.
От си мне нужен только его компилятор. Либы - в болото!
Номер ответа: 9
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 19.02.06 02:59
мя тоже с new глючит, с VirtualAlloc неумею, пример в студию
Vito, покаж как у тя через new работает, плз...
Номер ответа: 10
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #10
Добавлено: 19.02.06 03:00
HOOLIGAN
Вопрос в том, что это за хрень. Не может такого быть. Может у меня студия глючит?
Это вопрос вкуса. Если нет нужды в кроссплатформенности API удобнее(хотя я больше привык с стандарту).
Номер ответа: 11
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #11
Добавлено: 19.02.06 04:46
HACKER
Оператор new (С++) не умеет работать с паматью так, как malloc, calloc (C), потому что С++ создавался как "улучшенная", "облегченная" версия С.
Насчет "улучшенная" можно поспорить...
Но С++ совместим с С, поэтому мы можем использовать библиотеку С.
Правда, не во всех случаях, возможна полная совместимость.
Вот переделанный пример.
{
int n=3,m=3,i;
int (*a)[ 3 ] = new int[ n ][ 3 ];
// второе измерение массива может быть только константой
a[1][0]=5;
a[1][1]=10;
printf ( " Calloc memory : "
printf ("%d\n", a[1][1];
printf ( " Calloc memory : "
printf ("%d\n", a[1][0];
delete[] a;
printf ( " Free memory : "
printf ("%d\n", a[1][1];
printf ( " Free memory : "
printf ("%d\n", a[1][0];
scanf("%d",&i);
return 0;
}
Номер ответа: 12
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #12
Добавлено: 19.02.06 21:13
А почему только delete[] a ? Разве ненадо ещё каждый как с free ?
for (i=0; i<=m; i++) free (a[i];
Номер ответа: 13
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #13
Добавлено: 19.02.06 22:23
Mы выделяем память оператором new.
Номер ответа: 14
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #14
Добавлено: 20.02.06 16:22
Не я понимаю, непонимаю как освобождать нужно когда через new
выделяем. Как через free, типа каждуя ячейку таблицы (двухмерного
массива), а потом и сам массив, или только как ты писал delete [] a
всё остальное освобождается по ходу само что-ли
Номер ответа: 15
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #15
Добавлено: 20.02.06 17:26
new : delete - это С++.
malloc : free - это С (без ++).
Выделение и освобождение происходит по разному. Из - за совместимости путают два языка.
Впрочем многие.
Главное запомни С это точно не С++ (malloc).
А С++(new) совместим с С(malloc) и может использовать его операторы.
Т.е. не смешивай два языка (хотя это возможно и иногда необходимо). Тогда все должно стать понятнее.
Оператор new проще malloc, и delete тоже проще free.
Когда мы используем new каждую ячейку освобождать не надо. Достаточно delete [] a.
Но как я написал, второе измерение массива в случае с new может быть только константой (ограничение).