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

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

В вызываемом delete.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
    #39741212
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
    #39741246
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semen,

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

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



Это понятно

Вопрос - почему мой код зависает ?
...
Рейтинг: 0 / 0
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
    #39741306
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы ответить на данный вопрос надо знать как устроен менеджер памяти в отношении 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
В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
    #39741310
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / В чем разница между std::unique_ptr<char> и std::unique_ptr<char[]> ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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