Re: удаление класса, возвращённого функцией
От: frogkiller Россия  
Дата: 10.06.11 20:00
Оценка: 3 (2) :))
Здравствуйте, tnikolai, Вы писали:

T>Из функции должны возвращаться данные в виде класса.

T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.

Если нельзя пользоваться {auto|scoped|shared|..}_ptr(), то можно сделать, например, так.

extern my_class_t func1();

{
    my_class_t a;
    func1().swap(a);
    // use a here
}


Функцию swap() тебе в качестве домашнего задания предлагается сделать самому.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[6]: удаление класса, возвращённого функцией
От: const_volatile  
Дата: 11.06.11 09:14
Оценка: +2 :)
E>>>>
extern my_class_t func1();

E>>>>{
E>>>>    my_class_t a = func1();
E>>>>    // use a here
E>>>>}


F>>>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп.

_>>благодаря семантике move-конструкторов, не начинает. курим c++0x на предмет rvalue-ссылок.
F>Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?

тот же, кто сказал, что my_class_t — это вектор на стопицот гигабайт.
Re: удаление класса, возвращённого функцией
От: okman Беларусь https://searchinform.ru/
Дата: 10.06.11 19:56
Оценка: 3 (1) +1
Здравствуйте, tnikolai, Вы писали:

T>Из функции должны возвращаться данные в виде класса.

T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.

Если объект возвращается по значению, то есть, копия, то ничего
специально делать не нужно — деструктор данного объекта будет вызван при выходе из
области видимости функции.
Re[5]: удаление класса, возвращённого функцией
От: frogkiller Россия  
Дата: 11.06.11 09:03
Оценка: 1 (1)
Здравствуйте, const_volatile, Вы писали:

E>>>
extern my_class_t func1();

E>>>{
E>>>    my_class_t a = func1();
E>>>    // use a here
E>>>}


F>>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп.


_>благодаря семантике move-конструкторов, не начинает. курим c++0x на предмет rvalue-ссылок.


Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re: удаление класса, возвращённого функцией
От: ZegSoft Россия  
Дата: 10.06.11 20:14
Оценка: +1
Здравствуйте, tnikolai, Вы писали:

T>Из функции должны возвращаться данные в виде класса.

T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.


Разберитесь в терминах!!! Класс никак нельзя удалить по определению!!! Поэтому не совсем понятно что именно Вам нужно. Можно пример кода?
Re[3]: удаление класса, возвращённого функцией
От: frogkiller Россия  
Дата: 10.06.11 20:24
Оценка: :)
Здравствуйте, enji, Вы писали:

E>гм, а зачем навороты со свапом?


E>
extern my_class_t func1();

E>{
E>    my_class_t a = func1();
E>    // use a here
E>}


Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп. В условии же не говорится, какие именно данные будут.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[3]: удаление класса, возвращённого функцией
От: frogkiller Россия  
Дата: 10.06.11 20:26
Оценка: :)
Здравствуйте, tnikolai, Вы писали:

T>Это уже не автоматически, а каждый раз надо писать


T>
T>    my_class_t a;
T>    func1().swap(a);
T>


Напиши макрос, который из этого сделает одну команду

Я ж первой строке свого ответа сказал: если нельзя воспользоваться стандартными смартпойнтерами, то...
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[3]: удаление класса, возвращённого функцией
От: Ops Россия  
Дата: 10.06.11 20:38
Оценка: +1
Здравствуйте, tnikolai, Вы писали:

T>Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new.

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

boost::shared_array
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: удаление класса, возвращённого функцией
От: wvoquine  
Дата: 11.06.11 09:19
Оценка: -1
Здравствуйте, tnikolai, Вы писали:

T>Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new.



Если это указатель на объект класса, то для этой цели хорошо подойдёт auto_ptr
To be is to be the value of a variable
Re: удаление класса, возвращённого функцией
От: jyuyjiyuijyu  
Дата: 01.07.11 09:12
Оценка: +1
Здравствуйте, tnikolai, Вы писали:

T>Из функции должны возвращаться данные в виде класса.

T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
зачем вообще возвращать указатель на нечто что потом еще придется удалять
вручную лучше создать это нечто выше в стеке пусть оно само себя удаляет
передать ссылку на это нечто куда нужно ниже для заполнения
Re[4]: удаление класса, возвращённого функцией
От: Erop Россия  
Дата: 01.07.11 12:37
Оценка: +1
Здравствуйте, sidorov18, Вы писали:

S>Ну да. Оптимизатор должен с этим справится.

S>Пример http://ideone.com/b79B3

Ну, в смысле, что если функция по значению возвращает, то сохранять это значение в ссылку, а не в копию никогда не выгодно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
удаление класса, возвращённого функцией
От: tnikolai  
Дата: 10.06.11 19:48
Оценка:
Из функции должны возвращаться данные в виде класса.
Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Re[2]: удаление класса, возвращённого функцией
От: enji  
Дата: 10.06.11 20:15
Оценка:
Здравствуйте, frogkiller, Вы писали:

F>Здравствуйте, tnikolai, Вы писали:


T>>Из функции должны возвращаться данные в виде класса.

T>>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.

F>Если нельзя пользоваться {auto|scoped|shared|..}_ptr(), то можно сделать, например, так.


F>
extern my_class_t func1();

F>{
F>    my_class_t a;
F>    func1().swap(a);
F>    // use a here
F>}


F>Функцию swap() тебе в качестве домашнего задания предлагается сделать самому.


гм, а зачем навороты со свапом?

extern my_class_t func1();

{
    my_class_t a = func1();
    // use a here
}
Re[2]: удаление класса, возвращённого функцией
От: tnikolai  
Дата: 10.06.11 20:15
Оценка:
F>
extern my_class_t func1();

F>{
F>    my_class_t a;
F>    func1().swap(a);
F>    // use a here
F>}


F>Функцию swap() тебе в качестве домашнего задания предлагается сделать самому.


Это уже не автоматически, а каждый раз надо писать

    my_class_t a;
    func1().swap(a);
Re[2]: удаление класса, возвращённого функцией
От: tnikolai  
Дата: 10.06.11 20:26
Оценка:
T>>Из функции должны возвращаться данные в виде класса.
T>>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
ZS>Разберитесь в терминах!!! Класс никак нельзя удалить по определению!!! Поэтому не совсем понятно что именно Вам нужно. Можно пример кода?

Объект класса.

Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new.
И я хочу чтоб в коде, вызывающем эту функцию, совершенно не надо было бы заботиться об удалении этого буфера.
Re[4]: удаление класса, возвращённого функцией
От: const_volatile  
Дата: 11.06.11 08:29
Оценка:
Здравствуйте, frogkiller, Вы писали:

E>>
extern my_class_t func1();

E>>{
E>>    my_class_t a = func1();
E>>    // use a here
E>>}


F>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп.


благодаря семантике move-конструкторов, не начинает. курим c++0x на предмет rvalue-ссылок.
Re[7]: удаление класса, возвращённого функцией
От: frogkiller Россия  
Дата: 11.06.11 11:35
Оценка:
Здравствуйте, const_volatile, Вы писали:

F>>>>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп.

_>>>благодаря семантике move-конструкторов, не начинает. курим c++0x на предмет rvalue-ссылок.
F>>Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?

_>тот же, кто сказал, что my_class_t — это вектор на стопицот гигабайт.


Ну, и я был недалеко от истины, тут топикстартер написал уже про массив данных.

И потом, правда же, что при сеансе телепатии лучше закладываться на более тяжелые условия. Вдруг ему нужно писать под MSVC6.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[4]: удаление класса, возвращённого функцией
От: enji  
Дата: 11.06.11 17:02
Оценка:
Здравствуйте, frogkiller, Вы писали:

F>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп. В условии же не говорится, какие именно данные будут.


ИМХО, тяжелые объекты лучше из функций не возвращать, а передавать в функцию по ссылке объект для заполнения. Все таки постоянно писать swap как-то напряжно, легко где-то забыть...
Re: удаление класса, возвращённого функцией
От: chijo Россия  
Дата: 01.07.11 07:33
Оценка:
Здравствуйте, tnikolai, Вы писали:

T>Из функции должны возвращаться данные в виде класса.

возвращается объект...
T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
при выходе из области видимости все локальные переменные созданные в стеке удаляются автоматически(соот-но компилятор сам добавляет код, который вызывает все нужные деструкторы). При возврате объекта по значению компилятор создает временный объект(адрес которого помещается как скрытый аргумент функции перед вызовом функции в стеке) с помощью копирующего конструктора и удаляет этот объект после завершения выполнения выражения, в котором вызывается данная функция.

Динамически созданные объекты возвращаются по указателю... Тогда надо явно вызывать delete или delete[](для массивов) когда возвращенный объект больше не нужен.
Re[2]: удаление класса, возвращённого функцией
От: Erop Россия  
Дата: 01.07.11 08:23
Оценка:
Здравствуйте, frogkiller, Вы писали:


F>
extern my_class_t func1();

F>{
F>    my_class_t a;
F>    func1().swap(a);
F>    // use a here
F>}


Открой для себя RVO/NRVO
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: удаление класса, возвращённого функцией
От: Erop Россия  
Дата: 01.07.11 08:25
Оценка:
Здравствуйте, frogkiller, Вы писали:

F>Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?


1) Потому, что работать ему проще, чем не работать...
2) Сама идея возвращать что-то тяжёлое по значению, а не отдавать буфер для заполнения -- спорная.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: удаление класса, возвращённого функцией
От: Erop Россия  
Дата: 01.07.11 08:25
Оценка:
Здравствуйте, wvoquine, Вы писали:

T>>Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new.

W>Если это указатель на объект класса, то для этой цели хорошо подойдёт auto_ptr


На объект, но не на вектор объектов!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: удаление класса, возвращённого функцией
От: Erop Россия  
Дата: 01.07.11 08:28
Оценка:
Здравствуйте, tnikolai, Вы писали:

T>Из функции должны возвращаться данные в виде класса.

T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.


Я так понял, что тебе надо вернуть массив объектов? Да?
Ну так сделай прямо и не страдай.
class MyData { ... };
void foo( std::vector<MeData>& toFill ) {
    //...
}

void bar()
{
    std::vector<MyData> data;
    foo( data );
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: удаление класса, возвращённого функцией
От: sidorov18 США  
Дата: 01.07.11 09:23
Оценка:
Здравствуйте, tnikolai, Вы писали:

T>Из функции должны возвращаться данные в виде класса.

T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.

Если хочется в одну строчку получать объекты, самое простое решение:
std::auto_ptr

Ну а если в функции все просто, то можно смело принимать объект по константной ссылке, RVO/NRVO сделают свое дело.
Re[2]: удаление класса, возвращённого функцией
От: Erop Россия  
Дата: 01.07.11 09:33
Оценка:
Здравствуйте, sidorov18, Вы писали:

S>Ну а если в функции все просто, то можно смело принимать объект по константной ссылке, RVO/NRVO сделают свое дело.


Зачем по ссылке? Можно и по значению...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Добавлю про stl
От: Erop Россия  
Дата: 01.07.11 09:39
Оценка:
E>
E>class MyData { ... };
E>void foo( std::vector<MeData>& toFill ) {
E>    //...
E>}

E>void bar()
E>{
E>    std::vector<MyData> data;
E>    foo( data );
E>}
E>


Только, если ты придерживаешься true stl way, то делать принято не так, как-то так примерно:
template<typename TIter>
TIter foo( TIter toInsert )
{
   //   тут какой-то код, цикл какой-то и т. д.
       *toInsert++ = currentElement;
   //   дальше код
   return toInsert;
}

void bar()
{
    std::vector<MyData> data;
    foo( back_inserter( data ) );
}
Ну и понятно, что внутри функции TIter foo( TIter toInsert ), тоже стараются не явно
*toInsert++ =
написать, а использовать какой-нибудь алгоритм, например из хедера algorithm...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: удаление класса, возвращённого функцией
От: sidorov18 США  
Дата: 01.07.11 12:34
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, sidorov18, Вы писали:


S>>Ну а если в функции все просто, то можно смело принимать объект по константной ссылке, RVO/NRVO сделают свое дело.


E>Зачем по ссылке? Можно и по значению...


Ну да. Оптимизатор должен с этим справится.
Пример http://ideone.com/b79B3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.