2013-08-20 2 views
2

В классе, в котором я участвую, рефакторинг деструктора не позволяет уничтожить его массив.Исправьте массив-член в C++

class MyClass{ 
    public: 
     double a; 
     double rect[4]; 

     MyClass(); 
     ~MyClass(); 
    }; 

    MyClass::MyClass() : a(123.0) 
    { 
     memset(rect, 0, 4 * sizeof(double)); 
    } 

    MyClass::~MyClass() {} 

Как его правильно уничтожить? Достаточно просто delete или мне также нужно установить следующее после?

delete[] rect; 
*rect= NULL; 
+7

Вы ничего не делаете, это не динамически выделяется. – jrok

+4

Кажется, вы изучаете C++ из источника подпара (любой достойный источник заставил бы вас четко осознавать, как это работает в C++ к тому времени, когда он вводит 'delete'). Если вы заинтересованы, мы сохраним [кураторский список хороших книг] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –

+1

И пока я нахожусь на нем, я бы посоветовал «memset», поскольку он бесполезен для ошибок; вы должны использовать 'std :: fill' с' std :: begin' и 'std :: end' (если ваш компилятор не обновлен, эти последние два легко реализовать: https: // gist. github.com/rmartinho/3959946). –

ответ

15

Как правило, вы должны удалить то, что вы новичок. Массив rect имеет то же хранилище, что и охватывающий объект, поэтому он будет заботиться о процессе удаления/выхода из области, в которой был выделен весь объект.

+2

«автоматическое хранение» означает, грубо говоря, выделение стека. Элемент 'rect' объекта MyClass имеет тот же класс хранения, что и сам объект MyClass, который зависит от того, как был создан объект MyClass. Но ваш главный вопрос правильный: уничтожение объекта-объекта позаботится об уничтожении члена 'rect'. –

1

Вам не нужно уничтожать его, потому что вы его не создали сами. Поскольку вы не получаете свою память на malloc() или new, вам не нужно free() или delete. Это автоматический идентификатор. Это просто автоматическая память. Это означает, что он все равно освобождается/удаляется самим процессом.

+0

Как я уже упоминал в другом ответе, стек не имеет значения (и на самом деле ложь требует, чтобы массив находился в стеке: http://coliru.stacked-crooked.com/view?id=a3b1d94b9b66f899824da862e468c630-d6c803482d553f395422ddf5510f4bb0) –

+0

@ R Мартиньо Фернандес, я сожалею, что публикую неправильные знания. Но я не знал этого лучше. не могли бы вы объяснить это мне плз? Моей точкой зрения было то, что все, что было выделено автоматически, хранится в стеке. Но probabl неправильно, поскольку вы ведете меня, чтобы исправить это. – dhein

+2

Это просто. Просто забудьте о местоположении и сосредоточьтесь на жизни (автоматическая или динамическая часть). Местоположение здесь ничего не диктует. Вы можете иметь материал, подобный этому массиву, в куче, и все равно не нужно его освобождать, и вы также можете иметь материал в стеке, который вы должны освободить самостоятельно. –

2

Вам не нужно ничего делать, поскольку оно выделяется в автоматическом хранилище, а не в динамической памяти. Просто общее правило:

  1. Если вы использовали new для выделения памяти, вам нужно использовать delete.

  2. Если вы использовали malloc(), calloc(), realloc(), то вы можете использовать free(). (Всегда пытайтесь использовать новые и удалять на C++.)

+1

Он не выделяется в стеке, если он не выделен в стеке. –

+0

@R.MartinhoFernandes исправил – Saksham

+1

http://coliru.stacked-crooked.com/view?id=a3b1d94b9b66f899824da862e468c630-d6c803482d553f395422ddf5510f4bb0 –

Смежные вопросы