Автор
|
Тема: Указатели!!!
|
zlelik |
опубликован 28-01-2002 23:17 MSK
ПИШУ int *lpPointer; lpPointer=new int[10];//Выделение памятиа как освободить память?
|
Serus
|
опубликован 28-01-2002 23:34 MSK
delete [] lpPointer; |
Freddy
|
опубликован 29-01-2002 17:54 MSK
точнее delete lpPointer; Открыли по new массив int из 10 штук, а не 10 массивов. |
Student
|
опубликован 29-01-2002 18:06 MSK
2Freddy: Че ты лажу пишешь ?! Правильно так:... int a = 100; int *lpInt; // указатель на тип int или массив данных типа int lpInt = &a; // OK, *lpInt == 100 ... lpInt = new int[10]; // далее обращаемся к 5-ому элементу массива lpInt[4] = 0; // 4 - т.к. отсчет начинается с нуля ... // удаляем массив delete []lpInt; ПРАВИЛО: Если выделяем память для массива (new xxx[xxx]), то и удаляем ее как массив (delete []xxx). Иначе просто new xxx и далее delete xxx. |
Stiff
|
опубликован 29-01-2002 18:11 MSK
А почему нельзя так int * p = new int[100]; if(p) delete(p); так проще |
Student
|
опубликован 29-01-2002 18:16 MSK
2Stiff: >> delete(p); По-моему здесь ты освобождаешь память, которую занимает первый элемент массива. А кто будет освобождать остатки ?! |
Stiff
|
опубликован 29-01-2002 18:38 MSK
С чего это ты взял delete(pointer) удаляет всю память за исключением вложенной ее надо отдельно Если не веришь посмотри под дебагером утечек не будет !!!!!
|
BlackLion
|
опубликован 29-01-2002 18:44 MSK
Девочки, не ссорьтесь! Все зависит от того, как реализован оператор delete в конкретной среде. Например, Borland C++ 5.0 при удалении массива простым delete'ом теряет память, а Borland C++Builder'у наплевать, каким delete'ом удалена память, он все равно все подчищает. |
Stiff
|
опубликован 29-01-2002 18:53 MSK
Хорошо а VC ++ 6.0 как ??? |
Student
|
опубликован 29-01-2002 21:26 MSK
К чему обязывает нас хороший стиль программирования ? К тому, чтобы ЛЮБОЙ кусок программы на С++/C работал в любой среде (будь то VC++, C++Builder или gcc в *nix). По-этому, вопросы типа "если это работает в xxx, то будет ли в yyy ?" неуместны. Придерживайтесь стандардов и конечный пользователь будет вам благодарен (в данном случае стандарт для удаления массива - оператор delete []). |
Stiff
|
опубликован 29-01-2002 21:33 MSK
2Student: Интересно Каким образом я могу откомпилировать CString на Builder`e или на VC ++ какойнибудь TComboBox или TForm ??? Сделаешь памятник поставлю |
zlelik
|
опубликован 29-01-2002 21:39 MSK
Спрасибо всем Я попробовалint *lpP; lpP=new int[110]; delete lpP; так работает в VC++ 6.0 ну если по правилам надо delete []lpP; то я за всеми конечностями. |
Student
|
опубликован 29-01-2002 22:00 MSK
2Stiff: Я имел в виду стандартные средства и функции (напр. strstr(), fopen() и т.д.), а не "местные выкрутасы" VC++ и C++Builder. Ведь речь здесь шла об операторе delete. Древнее его, я думаю, трудно что-то придумать. |
golem
|
опубликован 30-01-2002 19:46 MSK
CString legko perenositsya na lyubuyu platformu. Sam perenosil na Linux i Mac. S klassami BCB huzhe - tam property est'A na p = new int[10]; delete p; Debug RTL VC++ vrode by rugaetsya. |
ye
|
опубликован 30-01-2002 20:16 MSK
Нифига не ругаетсяВ инете пишут что delete [] надо пользовать есть у тебя массив классов и надо их деструкторы вызывать. Для простых типов - просто delete. Если сделать piItems = new int[100]; а потом delete piItems, то ниодин компилер вам только первый элемент не удалит. Код delete никогда не содержит в себе realloc Также как по поинтеру никто размера блока не считает. Выделеные блок памяти содержит в себе свой размер. Кто в сомнениях - генерити листинги и смотрите асм. |