в следующем коде:
class x
{
private:
someRef& m_ref;
public:
x(someRef& someRef):m_ref(someRef)
{
}
сделайте я должен сделать:
~x()
{
delete m_ref;
}
который между прочим не работает, не получая указатель...
в основном я спрашиваю: я должен назвать деструктор на ссылочном участнике?
Нет. Вы можете удалять только указатели, но не ссылки, и даже в этом случае вы должны удалять только объекты, выделенные вами с помощью оператора new
. И тогда вы должны обязательно удалить их только один раз. Вот случай, когда вам нужно будет использовать delete
в вашем деструкторе:
class x
{
private:
someObj* m_ptr;
public:
x():m_ptr(new someObj())
{
}
~x()
{
delete m_ptr;
}
Но в целом лучше избегать даже этого и вместо этого использовать умные указатели.
Нет.
Вам нужно только удалить
объект, если он принадлежит вам. Если вам передали ссылку, это означает, что она принадлежит кому-то другому, поэтому в ней нет необходимости, и, к счастью, язык предотвращает это.
Я хочу прояснить некоторые заблуждения, которые, кажется, у вас есть, но которые выходят за рамки смысла вашего вопроса:
Когда вызывается деструктор класса, вызываются и деструкторы всех его членов.
Вызов delete
- это не то же самое, что вызов деструктора. delete
явно вызывает деструктор, а также вызывает operator delete
в местоположении объекта, это две части.
Я не думаю, что на самом деле, строго говоря, когда-либо удаляются четные указатели. Вы удаляете динамически выделяемые объекты (или массивы объектов), для которых указатель является дескриптором. Если объект возник в результате вызова new и этот класс несет ответственность за очистку после этого объекта, тогда вы вызываете delete .
Технически возможно, что ссылка может относиться к динамически выделяемому объекту:
int main()
{
//in principle a reference can also refer to a dynamically allocated object
x var(*new someRef);
}
//and if that is the intended usage:
x::~x()
{
delete &m_ref;
}
Однако это было бы невероятно плохим стилем. По соглашению дескриптор «владеющего» динамически выделяемого объекта не должен быть ссылкой.