объявить определенный класс как структуру внутри параметра шаблона - PullRequest
1 голос
/ 04 августа 2020

A класс A определен и реализован. Позже он объявлен как struct как аргумент шаблона для std::unique_ptr. Компилятор (g ++ 10.1) ничего не жалуется на это, и программу можно запустить.

#include <iostream>
#include <string>
#include <memory>

class A
{
public:
    std::string info = "Hello World!";
};

int main()
{
    std::unique_ptr<struct A> a{new A};
    std::cout << a->info << "\n";
    return 0;
}

Если я определю a без new A

std::unique_ptr<struct A> a;

Код все еще может быть скомпилированным, но во время выполнения происходит ошибка сегментации. Так почему это возможно?

1 Ответ

1 голос
/ 04 августа 2020

Разрешено смешивать class и struct в объявлении , это проблема только в определении класса. Для получения дополнительных сведений см. Класс смешивания и структуру .

Ошибка сегмента во втором случае возникает из-за нулевого указателя доступа, формы неопределенного поведения.

std::unique_ptr<struct A> a; инициализирует a в «пустое» состояние. Затем a->info получит доступ к нулевому указателю, что в вашем случае вызывает ошибку сегмента.

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