WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Указатели!!!

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Указатели!!!
zlelik опубликован 28-01-2002 23:17 MSK   Click Here to See the Profile for zlelik   Click Here to Email zlelik  
ПИШУ
int *lpPointer;
lpPointer=new int[10];//Выделение памяти

а как освободить память?


Serus опубликован 28-01-2002 23:34 MSK     Click Here to See the Profile for Serus    
delete [] lpPointer;
Freddy опубликован 29-01-2002 17:54 MSK     Click Here to See the Profile for Freddy  Click Here to Email Freddy     
точнее
delete lpPointer;
Открыли по new массив int из 10 штук,
а не 10 массивов.
Student опубликован 29-01-2002 18:06 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
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     Click Here to See the Profile for Stiff  Click Here to Email Stiff     
А почему нельзя так
int * p = new int[100];
if(p)
delete(p);
так проще
Student опубликован 29-01-2002 18:16 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
2Stiff:
>> delete(p);
По-моему здесь ты освобождаешь память, которую занимает первый элемент массива. А кто будет освобождать остатки ?!
Stiff опубликован 29-01-2002 18:38 MSK     Click Here to See the Profile for Stiff  Click Here to Email Stiff     
С чего это ты взял delete(pointer) удаляет всю память за исключением вложенной ее надо отдельно
Если не веришь посмотри под дебагером утечек не будет !!!!!
BlackLion опубликован 29-01-2002 18:44 MSK     Click Here to See the Profile for BlackLion  Click Here to Email BlackLion     
Девочки, не ссорьтесь! Все зависит от того, как реализован оператор delete в конкретной среде.
Например, Borland C++ 5.0 при удалении массива простым delete'ом теряет память, а Borland C++Builder'у наплевать, каким delete'ом удалена память, он все равно все подчищает.
Stiff опубликован 29-01-2002 18:53 MSK     Click Here to See the Profile for Stiff  Click Here to Email Stiff     
Хорошо а VC ++ 6.0 как ???
Student опубликован 29-01-2002 21:26 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
К чему обязывает нас хороший стиль программирования ? К тому, чтобы ЛЮБОЙ кусок программы на С++/C работал в любой среде (будь то VC++, C++Builder или gcc в *nix). По-этому, вопросы типа "если это работает в xxx, то будет ли в yyy ?" неуместны. Придерживайтесь стандардов и конечный пользователь будет вам благодарен (в данном случае стандарт для удаления массива - оператор delete []).
Stiff опубликован 29-01-2002 21:33 MSK     Click Here to See the Profile for Stiff  Click Here to Email Stiff     
2Student:
Интересно Каким образом я могу откомпилировать CString на Builder`e
или на VC ++ какойнибудь TComboBox или TForm ???
Сделаешь памятник поставлю
zlelik опубликован 29-01-2002 21:39 MSK     Click Here to See the Profile for zlelik  Click Here to Email zlelik     
Спрасибо всем
Я попробовал

int *lpP;
lpP=new int[110];
delete lpP;

так работает в VC++ 6.0
ну если по правилам надо
delete []lpP;

то я за всеми конечностями.

Student опубликован 29-01-2002 22:00 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
2Stiff: Я имел в виду стандартные средства и функции (напр. strstr(), fopen() и т.д.), а не "местные выкрутасы" VC++ и C++Builder. Ведь речь здесь шла об операторе delete. Древнее его, я думаю, трудно что-то придумать.
golem опубликован 30-01-2002 19:46 MSK     Click Here to See the Profile for golem  Click Here to Email golem     
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     Click Here to See the Profile for ye  Click Here to Email ye     
Нифига не ругается

В инете пишут что delete [] надо пользовать есть у тебя массив классов и надо их деструкторы вызывать.
Для простых типов - просто delete.

Если сделать piItems = new int[100];
а потом delete piItems, то ниодин компилер вам только первый элемент не удалит.
Код delete никогда не содержит в себе realloc
Также как по поинтеру никто размера блока не считает.
Выделеные блок памяти содержит в себе свой размер.

Кто в сомнениях - генерити листинги и смотрите асм.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.