Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > delete p и delete [] p в чём отличие???


Автор: ano360 20.7.2006, 19:59
Встречал такие формы написания делите :delete p, где  p-указатель и delete [] p, оба работают, не вызывая ошибок, так в чём же отличие? 

Автор: Damarus 20.7.2006, 20:45
delete[] - для массивов.

Код

int *p_int = new int;
*p_int = 10;
delete p_int;

int *p_int_array = new int[5];
p_int_array[0] = 1;
p_int_array[1] = 1;
p_int_array[2] = 1;
p_int_array[3] = 1;
p_int_array[4] = 1;
delete[] p_int_array;


Цитата(ano360 @  20.7.2006,  20:59 Найти цитируемый пост)
оба работают, не вызывая ошибок

Толко для простых типов, для классов могут быть проблеммы с вызовом деструктора.
 

Автор: GremlinProg 20.7.2006, 20:51
в том, что первый оператор удаляет только один объект по адресу p, а второй - удаляет массив объектов, созданных оператором new[], т.е., конкретно, разница заключается в том, будут ли последовательно вызваны деструкторы у удаляемых объектов или нет. В delete[] p - будут, а в delete p будет вызван только один деструктор, так что если это массив, то остальные объекты останутся без деинициализации. 

Автор: slava72 21.7.2006, 11:39
new T - вызывает operator new()
new  T[]   - вызывает operator new[]()

опрераторы delete и delete[] парные к new - соответственно должен вызывать нужный в зависимости от того, чем паспределял память.

Их сам можешь переопределить для какого нибудь класса (при очень большом желании и понимании что делаешь smile в таком случае рекомендуется как минимум переопределять 6 функций на new/delete и если надо те.же 6 на new[]/delete[]

void* operator new(size_t) - классический 
void* operator new(size_t, void*) - оператор размещения (используется в частности std::контейнерами)
void* operator new(size_t,  std::nothrow) - не генерит исключений (возвращает 0 при нехватке памяти)

и парные им delete

 

Автор: ano360 24.7.2006, 00:24
спасибо 

Автор: sergejzr 24.7.2006, 01:01
Вот, поиграйтесь smile
Код



#include <iostream.h>


int cnt=0;

//это будут индикаторы
//0 - обьект не создавался
//1 - обьект создавался, но не удалялся
//обьект создавался и корректно удалён
int *all=new int[256];//пусть будет достаточно :)
void setup_test(){
int i=0;
for(i=0;i<256;i++)
all[i]=0;//все на ноль
}



class D
{
int number;

public :
    D()
    {
        number=cnt;
        all[cnt]=1;//пометим 
        cnt++;
    }
    ~D()
    {
     cout<<"I die "<<number<<endl;
     all[number]=2;
    }
};
void test1()
{
D* y=new D[5];//здесь утечка будет
}
void test2()
{
D y=D(); // здесь компилер сам деструктирует в конце
}
void test3()
{
    D y[3]={D(),D(),D()}; // здесь компилер сам деструктирует в конце
}
int main()
{
    setup_test();
    D* x=new D();
    delete x;
    cout<<"now another step"<<endl;
    D* y=new D[5];
    delete [] y;

    cout<<"now try function 1"<<endl;
    test1();

    cout<<"now try function 2"<<endl;
    test2();

    cout<<"now try function 3"<<endl;
    test3();

    cout <<"resultat"<<endl;
    for(int i=0;i<cnt;i++)
    {
        cout<<"element "<<i<<(all[i]==0?" ne sozdavalsja":all[i]==1?" ne udaljon (utechka)":all[i]==2?" sozdavalsja i korrektno udaljon":"undefined")<<endl;
    }
/*
//А это будет ошибкой, ведь обьектов не существует,
//а delete попытается вызвать деструкторы..
D* z=new D[15];
    delete [] z;
*/

  return 0;
 }
   

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)