Деструктор C ++: аргумент типа «***» для «delete», ожидаемый указатель - PullRequest
12 голосов
/ 20 декабря 2008

Я объявил личную переменную

vector<SomeClass> theVector;

где-то внутри моего класса SomeClass.

Почему я не могу сказать: delete theVector внутри моего деструктора SomeClass?

Ошибка компилятора говорит:

 type `class Vector<SomeClass>' argument given to `delete', expected pointer 

Какой ожидаемый указатель?

Ответы [ 7 ]

19 голосов
/ 20 декабря 2008

Если новый и удалить, идти рука об руку.

Чтобы удалить что-то, вам нужно создать это с помощью нового (который дает вам указатель). Затем вы можете удалить указатель. То, как вы объявляете вектор, он создается в стеке (а не в куче) и будет освобожден, когда он выйдет из области видимости.

int main()
{
    vector<SomeClass> theVector;

    vector<SomeClass>* ptrVctor = new vector<SomeClass>();


    delete ptrVctor;   // ptrVctor must be deleted manually
    // theVector destroyed automatically here
}
8 голосов
/ 20 декабря 2008

В C ++ (в отличие от Java) вы можете создавать объекты либо в стеке, либо в куче. Пример создания этого в стеке, как вы сделали:

vector<SomeClass> theVector;

Этот объект выходит из области видимости, когда кадр стека исчезает (обычно, когда вы возвращаетесь из функции, создавшей объект.

Создание объектов в куче позволяет им пережить функцию, которая их создала, и вы делаете это, выполняя:

vector<SomeClass> *theVectorPtr = new vector<SomeClass>();

Затем вы можете передать указатель theVectorPtr обратно в вызывающую функцию (или сохранить его глобально, как хотите).

Чтобы избавиться от объекта в куче, вы явно удаляете его:

delete theVectorPtr;

где-то в вашем коде.

Удаление объекта в куче завершает область действия этого объекта, точно так же, как возврат из функции завершает область действия переменных, созданных в стеке.

3 голосов
/ 20 декабря 2008

Если объект (а не значение) определен как переменная члена класса, то его хранилище всегда привязано к экземпляру объекта этого класса.

Следовательно, если содержащий объект размещен в стеке, то этот объект и поле умрут, когда стек развернется.

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

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

2 голосов
/ 12 января 2009

Чтобы уничтожить все объекты, содержащиеся в векторе, вы должны сделать следующее:

theVector.resize(0);

Это произойдет автоматически, когда вектор выйдет из области видимости.

2 голосов
/ 20 декабря 2008

Память для theVector является частью памяти, выделенной для объекта SomeClass, поэтому вы не можете удалить ее, не удалив весь объект SomeClass. Память для вектора будет автоматически освобождена при разрушении объекта SomeClass.

1 голос
/ 20 декабря 2008

c ++ дает вам гибкость для создания объектов в стеке и куче. Когда объект создается в куче с помощью оператора new, как показано ниже, он возвращает указатель на объект в куче.

ClassA * pobj_class = new ClassA();

Для объекта, созданного в стеке, конструктор возвращает объект, а не указатель, как показано ниже.

ClassA obj_class();

и стековый объект автоматически уничтожается, когда переменная (obj_class) выходит из области видимости, но объект, созданный в куче, живет вечно. Для уничтожения объекта кучи c ++ предоставляет вам оператор delete, который принимает указатель в качестве аргумента и уничтожает объект, на который указывает указатель к.

1 голос
/ 20 декабря 2008

Это потому, что вектор не является указателем, а delete' expects. "Expected pointer" means the operand of delete 'должен быть указателем.

Сравните это с

int theInt;
delete theInt;

Это наверняка сгенерирует ошибку, похожую на ту, что вы получили.

...