C++ должен удалить ссылки?

в следующем коде:

class x
{
private:
 someRef& m_ref;

public:
 x(someRef& someRef):m_ref(someRef)
{ 
}

сделайте я должен сделать:

~x()
{
  delete m_ref;
}

который между прочим не работает, не получая указатель...

в основном я спрашиваю: я должен назвать деструктор на ссылочном участнике?

10
задан 3 revs, 3 users 91% 20 January 2017 в 14:12
поделиться

4 ответа

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

class x
{
private:
 someObj* m_ptr;

public:
 x():m_ptr(new someObj())
{ 
}

 ~x()
{
  delete m_ptr;
}

Но в целом лучше избегать даже этого и вместо этого использовать умные указатели.

4
ответ дан 3 December 2019 в 14:43
поделиться

Нет.

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

18
ответ дан 3 December 2019 в 14:43
поделиться

Я хочу прояснить некоторые заблуждения, которые, кажется, у вас есть, но которые выходят за рамки смысла вашего вопроса:

Когда вызывается деструктор класса, вызываются и деструкторы всех его членов.

Вызов delete - это не то же самое, что вызов деструктора. delete явно вызывает деструктор, а также вызывает operator delete в местоположении объекта, это две части.

2
ответ дан 3 December 2019 в 14:43
поделиться

Я не думаю, что на самом деле, строго говоря, когда-либо удаляются четные указатели. Вы удаляете динамически выделяемые объекты (или массивы объектов), для которых указатель является дескриптором. Если объект возник в результате вызова 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;
}

Однако это было бы невероятно плохим стилем. По соглашению дескриптор «владеющего» динамически выделяемого объекта не должен быть ссылкой.

7
ответ дан 3 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: