Деструктор C++: введите аргумент ' * * * 'для ' delete', ожидаемый указатель
я объявил закрытую переменную
vector<SomeClass> theVector;
где-то внутри моего класса SomeClass.
почему я не могу сказать: delete theVector
внутри моего деструктора SomeClass?
ошибка компилятора говорит:
type `class Vector<SomeClass>' argument given to `delete', expected pointer
ожидается, что указатель?
7 ответов
Если new и delete идут рука об руку.
чтобы удалить что-то, вам нужно создать его с помощью new (что дает вам указатель). Затем можно удалить указатель. Способ объявления вектора, который создается в стеке (а не в куче), и будет освобожден, когда он выйдет за пределы области.
int main()
{
vector<SomeClass> theVector;
vector<SomeClass>* ptrVctor = new vector<SomeClass>();
delete ptrVctor; // ptrVctor must be deleted manually
// theVector destroyed automatically here
}
В C++ (в отличие от Java) вы можете создавать объекты либо в стеке, либо в куче. Примером создания его в стеке является, как вы это сделали:
vector<SomeClass> theVector;
этот объект выходит за рамки, когда кадр стека исчезает (обычно, когда вы возвращаетесь из функции, которая создала объект.
создание объектов в куче позволяет им пережить функцию, которая их создала, и вы делаете это, выполняя:
vector<SomeClass> *theVectorPtr = new vector<SomeClass>();
затем вы можете передать theVectorPtr
указатель назад к вызывающему объекту функции (или сохраните его глобально, что угодно).
чтобы избавиться от объекта в куче, вы явно удаляете его:
delete theVectorPtr;
где-то в коде.
удаление объекта в куче завершает область этого объекта, точно так же, как возврат из функции завершает область переменных, созданных в стеке.
Если объект (а не значение) определяется как переменная-член класса, то его хранение всегда привязана к экземпляру объекта этого класса.
поэтому, если содержащий объект выделен в стеке, то этот объект и поле умрут, когда стек развернется.
Если содержащий объект выделен в куче, то объект поля умрет, когда весь содержащий объект умрет с delete.
вы будете только применять удалить в поле, если это указатель, так как все, что хранится с содержащим объектом, является адресом какой-либо другой области памяти, и вы удаляете материалы в этой области.
память для theVector является частью памяти, выделенной для объекта SomeClass, поэтому вы не можете удалить ее без удаления всего объекта SomeClass. Память для theVector будет автоматически освобождена при уничтожении объекта SomeClass.
чтобы уничтожить все объекты, содержащиеся в векторе, вы должны сделать следующее:
theVector.resize(0);
это произойдет автоматически, когда вектор выходит за пределы области.
Это потому, что theVector-это не указатель, что delete' expects. "Expected pointer" means the operand of
удалить должен быть указателем.
сравните это с
int theInt;
delete theInt;
это, безусловно, будет генерировать ошибку, похожую на то, что вы получили.
c++ дает вам гибкость для создания объекта в стеке и куче. Когда объект создается в куче через оператор new, как показано ниже, он возвращает указатель на объект в куче.
ClassA * pobj_class = new ClassA();
для объектов, созданных в стеке конструктор возвращает объект, а не указатель, как показано ниже.
ClassA obj_class();
и объект стека автоматически уничтожается, когда переменная (obj_class) выходит за рамки,но объект, созданный в куче, живет вечно.Итак, чтобы уничтожить объект кучи c++ дает оператор delete, который принимает указатель в качестве аргумента и уничтожает объект, на который указывает указатель.