Как использовать указатель с объектами;Конструкторы и деструкторы.C ++ - PullRequest
0 голосов
/ 20 марта 2019

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

Object 1 is created, we've got 1 object(s) now!

Object 2 is created, we've got 2 object(s) now!

Object 3 is created, we've got 3 object(s) now!

Object 3 is deleted, we've got 2 object(s) now!

Object 2 is deleted, we've got 1 object(s) now!

Object 4 is created, we've got 2 object(s) now!

Object 4 is deleted, we've got 1 object(s) now!

Object 1 is deleted, we've got 0 object(s) now!  

код:

class Object {
public:
    Object(int i) {
        id = i;
        count++;
        cout<<"Object "<<id<<" is created, we've got "<<count<<" object(s) now!"<<endl;
    }
    ~Object() {
        count--;
        cout<<"Object "<<id<<" is deleted, we've got "<<count<<" object(s) now!"<<endl;
    }
private: 
    int id;
    static int count;
};  

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

#include"Object.h"
extern void TestObjects()
    {

    Object *a;
    Object obj1(1),obj2(2),obj3(3);

    a = &obj3;
    delete a;

    Object *c;
    c = &obj2;
    delete c;

    }

До сих пор он только создает 3 объекта и удаляет третий сразу после создания, и я пытаюсь удалить второй сразу после удаления третьего.

1 Ответ

3 голосов
/ 20 марта 2019

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

Если вы хотите использовать delete для управления порядком уничтожения,вы ДОЛЖНЫ использовать new, например:

void TestObjects()
{
    Object *obj1 = new Object(1);
    Object *obj2 = new Object(2);
    Object *obj3 = new Object(3);

    delete obj3;
    delete obj2;

    Object *obj4 = new Object(4);
    delete obj4;

    delete obj1;
}

Live Demo

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

void TestObjects()
{
    Object obj1(1);

    {
    Object obj2(2);
    Object obj3(3);
    } // <-- obj3 and obj2 are destroyed here, in that order!

    Object obj4(4);
} // <-- obj4 and obj1 are destroyed here, in that order!

Live Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...