Из функции должны возвращаться данные в виде класса.
Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса. T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Если объект возвращается по значению, то есть, копия, то ничего
специально делать не нужно — деструктор данного объекта будет вызван при выходе из
области видимости функции.
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса. T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Если нельзя пользоваться {auto|scoped|shared|..}_ptr(), то можно сделать, например, так.
extern my_class_t func1();
{
my_class_t a;
func1().swap(a);
// use a here
}
Функцию swap() тебе в качестве домашнего задания предлагается сделать самому.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса. T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Разберитесь в терминах!!! Класс никак нельзя удалить по определению!!! Поэтому не совсем понятно что именно Вам нужно. Можно пример кода?
Здравствуйте, 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
}
Здравствуйте, enji, Вы писали:
E>гм, а зачем навороты со свапом?
E>
extern my_class_t func1();
E>{
E> my_class_t a = func1();
E> // use a here
E>}
Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп. В условии же не говорится, какие именно данные будут.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
T>>Из функции должны возвращаться данные в виде класса. T>>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся. ZS>Разберитесь в терминах!!! Класс никак нельзя удалить по определению!!! Поэтому не совсем понятно что именно Вам нужно. Можно пример кода?
Объект класса.
Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new.
И я хочу чтоб в коде, вызывающем эту функцию, совершенно не надо было бы заботиться об удалении этого буфера.
Здравствуйте, tnikolai, Вы писали:
T>Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new. T>И я хочу чтоб в коде, вызывающем эту функцию, совершенно не надо было бы заботиться об удалении этого буфера.
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-ссылок.
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?
Курица — это инструмент, с помощью которого одно яйцо производит другие.
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 — это вектор на стопицот гигабайт.
Здравствуйте, tnikolai, Вы писали:
T>Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new.
Если это указатель на объект класса, то для этой цели хорошо подойдёт auto_ptr
Здравствуйте, const_volatile, Вы писали:
F>>>>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп. _>>>благодаря семантике move-конструкторов, не начинает. курим c++0x на предмет rvalue-ссылок. F>>Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?
_>тот же, кто сказал, что my_class_t — это вектор на стопицот гигабайт.
Ну, и я был недалеко от истины, тут топикстартер написал уже про массив данных.
И потом, правда же, что при сеансе телепатии лучше закладываться на более тяжелые условия. Вдруг ему нужно писать под MSVC6.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Здравствуйте, frogkiller, Вы писали:
F>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп. В условии же не говорится, какие именно данные будут.
ИМХО, тяжелые объекты лучше из функций не возвращать, а передавать в функцию по ссылке объект для заполнения. Все таки постоянно писать swap как-то напряжно, легко где-то забыть...
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса.
возвращается объект... T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
при выходе из области видимости все локальные переменные созданные в стеке удаляются автоматически(соот-но компилятор сам добавляет код, который вызывает все нужные деструкторы). При возврате объекта по значению компилятор создает временный объект(адрес которого помещается как скрытый аргумент функции перед вызовом функции в стеке) с помощью копирующего конструктора и удаляет этот объект после завершения выполнения выражения, в котором вызывается данная функция.
Динамически созданные объекты возвращаются по указателю... Тогда надо явно вызывать delete или delete[](для массивов) когда возвращенный объект больше не нужен.
extern my_class_t func1();
F>{
F> my_class_t a;
F> func1().swap(a);
F> // use a here
F>}
Открой для себя RVO/NRVO
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, frogkiller, Вы писали:
F>Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?
1) Потому, что работать ему проще, чем не работать...
2) Сама идея возвращать что-то тяжёлое по значению, а не отдавать буфер для заполнения -- спорная.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, wvoquine, Вы писали:
T>>Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new. W>Если это указатель на объект класса, то для этой цели хорошо подойдёт auto_ptr
На объект, но не на вектор объектов!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском