Форум программистов, компьютерный форум CyberForum.ru

Объясните как выделяется память под умные указатели - C++

Восстановить пароль Регистрация
 
 
Mikhail1990
9 / 9 / 1
Регистрация: 22.03.2014
Сообщений: 155
15.08.2015, 13:59     Объясните как выделяется память под умные указатели #1
Читаю книгу Праты, не могу понять этот абзац, а точнее применение операторов new [] и new и delete[] и delete с ними.

Объект auto_ptr или shared_ptr должен использоваться только для памяти,
выделенной операцией new. Память, выделенная с помощью new [ ], не подходит. Нельзя применять
auto_ptr, shared_ptr или unique_ptr для памяти, выделенной посредством операции
new либо, в случае unique_ptr, с помощью new или new [ ].
Почему нельзя применять new[].
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2015, 13:59     Объясните как выделяется память под умные указатели
Посмотрите здесь:

Умные указатели C++
Как выделяется память под массив string? C++
Не выделяется память C++
Умные указатели C++
C++ умные указатели
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PavelPol
21 / 21 / 10
Регистрация: 05.11.2014
Сообщений: 97
15.08.2015, 14:17     Объясните как выделяется память под умные указатели #2
Указанные операторы могут работать только с одним объектом и сами освобождают выделенную память. В случае с new[] выделяется массив объектов и алгоритмы для освобождения другие. Плюс к тому, эти "умные указатели" запускают конструктор и деструктор у объекта.
Mikhail1990
9 / 9 / 1
Регистрация: 22.03.2014
Сообщений: 155
15.08.2015, 14:22  [ТС]     Объясните как выделяется память под умные указатели #3
PavelPol, а можно наглядный примерчик? И
unique_ptr
умеет работать с
new []
.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,214
Завершенные тесты: 3
15.08.2015, 14:23     Объясните как выделяется память под умные указатели #4
Mikhail1990, потому что у деструкторов умных указателей вызывается delete, а не delete[], как должно быть в случае массивов. А у unique_ptr есть конструктор/деструктор для объектов-массивов. Создается как
C++
1
std::unique_ptr<SomeClass[]> as(new SomeClass[4]);
Mikhail1990
9 / 9 / 1
Регистрация: 22.03.2014
Сообщений: 155
15.08.2015, 14:45  [ТС]     Объясните как выделяется память под умные указатели #5
tnk500, В книге вот такой пример который тоже верный
std::unique_ptr< double[]>pda(new double(5)); // будет использовать delete []
так ли это?

Добавлено через 10 минут
tnk500, и оператор new или new [ ] я не могу использовать с shared_ptr and auto_ptr, верно?
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
15.08.2015, 15:59     Объясните как выделяется память под умные указатели #6
Цитата Сообщение от Mikhail1990 Посмотреть сообщение
должен использоваться только для памяти,
выделенной операцией new.
ложь.

Цитата Сообщение от Mikhail1990 Посмотреть сообщение
Память, выделенная с помощью new [ ]
std::unique_ptr умеет работать с массивами.
так что, это тоже - ложь.

Добавлено через 1 минуту
Цитата Сообщение от Mikhail1990 Посмотреть сообщение
std::unique_ptr< double[]>pda(new double(5)); // будет использовать delete []
это - UB
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,214
Завершенные тесты: 3
15.08.2015, 16:16     Объясните как выделяется память под умные указатели #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Mikhail1990,
1. Так сделать можно, но нельзя: вы инициализируете указатель как указатель на массив, следовательно, можете, кхм... скакать по памяти с помощью него. Поэтому разницы между таким определением и определением нормальным вы не заметите, во всяком случае, пока во время инициализации массива не схватите access violation или еще что-нибудь. Ну а там очистка ресурсов еще вызовет вопросов.
2. Верно.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
15.08.2015, 16:46     Объясните как выделяется память под умные указатели #8
Цитата Сообщение от tnk500 Посмотреть сообщение
2. Верно.
shared_ptr нормально работает с массивами, было бы желание.

C++
1
std::shared_ptr<Foo> sp(new Foo[10], [](Foo * p) { delete[] p; });
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,214
Завершенные тесты: 3
15.08.2015, 16:50     Объясните как выделяется память под умные указатели #9
ct0r, неужели? А обращаться к элементам как будете?) Одним делитером дело не может ограничиться.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
15.08.2015, 16:56     Объясните как выделяется память под умные указатели #10
Цитата Сообщение от tnk500 Посмотреть сообщение
неужели? А обращаться к элементам как будете?
вы пишите это так, словно вам трудно самому догадаться:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <memory>
 
 
struct some
{
    some() { std::cout<<"ctor\n"; }
   ~some() { std::cout<<"dtor\n"; }
    
    void set(const int v) { mV = v; }
    
    int mV;
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::shared_ptr<some> 
        smart(new some[10], [](some* const p) { delete[] p; });
    
    (smart.get() + 1)->set(10);
    
}
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,214
Завершенные тесты: 3
15.08.2015, 17:01     Объясните как выделяется память под умные указатели #11
hoggy, я ж говорю — одним делитером дело не ограничится. Но ведь и вы понимаете, почему так делать не нужно)
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
15.08.2015, 17:08     Объясните как выделяется память под умные указатели #12
Цитата Сообщение от tnk500 Посмотреть сообщение
ct0r, неужели? А обращаться к элементам как будете?) Одним делитером дело не может ограничиться.
Факт остается фактом. shared_ptr может спокойно хранить массив. Обращаться через сырой пойнтер конечно же.

Я, кстати, немного перемудрил. Можно даже так:
C++
1
std::shared_ptr<Foo> sp(new Foo[10], std::default_delete<Foo[]>());
Добавлено через 5 минут
Цитата Сообщение от tnk500 Посмотреть сообщение
почему так делать не нужно
Нужно-нужно. Ты думаешь operator[] у unique_ptr что-то особенное делает? Он делает тот же get()[i].
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,214
Завершенные тесты: 3
15.08.2015, 17:10     Объясните как выделяется память под умные указатели #13
ct0r, поэтому и не нужно. Вы работали в коллективе? Вряд ли такой форме индексации обрадуются ваши коллеги...
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
15.08.2015, 17:19     Объясните как выделяется память под умные указатели #14
Цитата Сообщение от tnk500 Посмотреть сообщение
ct0r, поэтому и не нужно. Вы работали в коллективе? Вряд ли такой форме индексации обрадуются ваши коллеги...
Обойдемся без телепатии? Это ваше субъективное мнение. А объективное заключается в том, что shared_ptr работает с массивами и точка. Это я показал кодом.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
15.08.2015, 17:33     Объясните как выделяется память под умные указатели #15
tnk500, since C++17 будет добавлена стандартная специализация shared_ptr/weak_ptr для массивов, так что такое "безобразное" обращение к элементам массива будет узаконено стандартом.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
15.08.2015, 17:49     Объясните как выделяется память под умные указатели #16
Цитата Сообщение от tnk500 Посмотреть сообщение
я ж говорю — одним делитером дело не ограничится. Но ведь и вы понимаете, почему так делать не нужно
мне не очевидно, почему данный функционал не включен в стандарт, как это сделанно для юник-птр.

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

в том, что касается "делать не нужно" - мне понятен ваш тезис.
на практике мне ни разу не было нужно подобное.
но это не означает, что это не нужно никому,
и что есть какие то противопоказания.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,214
Завершенные тесты: 3
15.08.2015, 17:52     Объясните как выделяется память под умные указатели #17
ct0r, пожалуйста, может так может (ведь можно и Си с ООП написать, хоть это уже и сделано. Вообще программирование дает много каких возможностей). И если с С++17 (как заметил gromo) будет поддержка, тогда тем более можно будет. Но я полагаю, вы решили написать здесь чтобы помочь новичку в разъяснении некоторых моментов насчет текущего положения умных указателей в языке, а не для того чтобы показать, что вы можете, так ведь?

Добавлено через 1 минуту
hoggy, вот и подождем 17 год, и тогда свои "костыли" мастырить не надо будет)
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
15.08.2015, 17:59     Объясните как выделяется память под умные указатели #18
Цитата Сообщение от tnk500 Посмотреть сообщение
вот и подождем 17 год, и тогда свои "костыли" мастырить не надо будет)
мне по прежнему не очевиден ваш тезис:

Цитата Сообщение от tnk500 Посмотреть сообщение
Но ведь и вы понимаете, почему так делать не нужно
я не понимаю, почему так делать не нужно.

мне не понятно почему в 15 году не нужно делать то,
что в 17 году станет официально законным.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,214
Завершенные тесты: 3
15.08.2015, 18:07     Объясните как выделяется память под умные указатели #19
hoggy, пожалуй, я несколько нервно отношусь к собственным реализациям того, чего по стандарту пока не предусмотрено. Конечно, для своего проекта так делать никто не мешает, да и если чуть постараться и сделать поудобней индексирование, вполне все будет прекрасно. Код должен быть простым и понятным, хотя это уже зависит от условий работы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2015, 18:18     Объясните как выделяется память под умные указатели
Еще ссылки по теме:

C++ Умные указатели
C++ Умные указатели на структуру с шаблоном
C++ Как выделяется память на стеке и на куче? Когда нужна ручная очистка?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
15.08.2015, 18:18     Объясните как выделяется память под умные указатели #20
Цитата Сообщение от tnk500 Посмотреть сообщение
пожалуй, я несколько нервно отношусь к собственным реализациям того, чего по стандарту пока не предусмотрено.
стандартом предусмотрена возможность указать собственную функцию удаления,
и получения указателя на начало данных.

это не есть "велосипед".
мы ведь проворачиваем подобное используя стандартное апи.
Yandex
Объявления
15.08.2015, 18:18     Объясните как выделяется память под умные указатели
Ответ Создать тему
Опции темы

Текущее время: 12:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru