Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ? / 8 сообщений из 8, страница 1 из 1
30.11.2018, 16:01
    #39741047
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
Сабж
...
Рейтинг: 0 / 0
30.11.2018, 16:12
    #39741067
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
первый указатель на char, второй - указатель на указатель на char

https://ru.cppreference.com/w/cpp/memory/unique_ptr
...
Рейтинг: 0 / 0
30.11.2018, 16:58
    #39741144
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
semen.s.semenСабж

В вызываемом delete.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.11.2018, 18:25
    #39741212
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int main() {
  struct t {
    t() {
        std::cout << "Constructor" << std::endl;
    }

    ~t() {
      std::cout << "Destructor" << std::endl;
      fflush(stdout);
    }
  };

  std::unique_ptr<t[]> aPtr = std::unique_ptr<t[]>(new t());
}



Почему такой код приводит к зависанию и бесконечной печати Destructor ?
...
Рейтинг: 0 / 0
30.11.2018, 19:06
    #39741246
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
semen.s.semen,

В std::unique_ptr<t[]> надо передавать массив, а не одиночный объект:
Код: plaintext
1.
std::unique_ptr<t[]>(new t[100]);
...
Рейтинг: 0 / 0
30.11.2018, 19:15
    #39741254
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
Anatoly Moskovskysemen.s.semen,

В std::unique_ptr<t[]> надо передавать массив, а не одиночный объект:
Код: plaintext
1.
std::unique_ptr<t[]>(new t[100]);



Это понятно

Вопрос - почему мой код зависает ?
...
Рейтинг: 0 / 0
30.11.2018, 21:05
    #39741306
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
Чтобы ответить на данный вопрос надо знать как устроен менеджер памяти в отношении delete[].

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

Поскольку
авторIf expression is not a null pointer, the delete expression invokes the destructor (if any) for the object that's being destroyed, or for every element of the array being destroyed (proceeding from the last element to the first element of the array).
то при освобождении массива память освобождается столько раз сколько было указано в угловых скобках new. Но поскольку здесь идет обращение к неинициализированному счетчику объектов (назовем это так) , то его значение может быть каким угодно, как правило довольно большим, поэтому delete[] вызывает деструкторы "несуществующих" объектов t и хреначит пока не переберет их все до последнего. То есть рано или поздно произойдет падение при обращении к недопустимому адресу, либо простой выход из цикла, либо бесконечная рекурсия из-за хаоса возникшего в менеджере памяти.

UB чистой воды

Только одно не понятно - нахера так делать? Жизнь скучна без приключений ?
...
Рейтинг: 0 / 0
30.11.2018, 21:13
    #39741310
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
semen.s.semenВопрос - почему мой код зависает ?

cppreferenceFor the second (array) form, expression must be a null pointer value or
a pointer value previously obtained by an array form of new-expression. If expression
is anything else, including if it's a pointer obtained by the non-array form of
new-expression, the behavior is undefined
.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]