Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
19 / 0 / 0
Регистрация: 27.08.2009
Сообщений: 19
1

Создание переменной при вызове функции

08.01.2016, 15:52. Показов 1660. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хочу создать переменную при вызове функции для укорачивания кода, например вместо такого:
C++
1
2
3
   wxVariant avSheetsItem[1];
    avSheetsItem[0] = wxVariant("Лист3"); 
   workSheets.GetObject(sheet , wxT("Item"), 1, avSheetsItem);
Хочу сделать такое:
C++
1
   workSheets.GetObject(sheet , wxT("Item"), 1, new wxVariant[1] {wxVariant("Лист3")});
Однако, как я понимаю память будет тикать, потому что освобождать то что выделено new не буду - может лучше есть способы?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2016, 15:52
Ответы с готовыми решениями:

Вылет приложения при вызове статической функции/переменной из библиотеки
Создал библиотеку в ней есть статический класс при вызове которого из приложения получаю аварийное...

Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов
Добрый вечер всем! При изучении и написании работы столкнулся с ошибкой от которой не могу...

Автоматический вызов функции при вызове функции
Доброго времени суток! Есть задача по событие вызова некой функции назовем ее function1(),...

Добавить аргумент при вызове функции при условии
Привет! Появился вопрос - можно ли добавить либо не добавлять аргумент при вызове функции исходя...

4
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
08.01.2016, 15:54 2
код не особо объяснил проблему, но выделять память через new - вредно, я использую умные указатели.
http://habrahabr.ru/post/140222/
http://ru.cppreference.com/w/cpp/memory/shared_ptr
1
19 / 0 / 0
Регистрация: 27.08.2009
Сообщений: 19
08.01.2016, 17:35  [ТС] 3
Ааам... наверное плохо объяснил.

Вместо трёх строчек:
C++
1
2
3
wxVariant avSheetsItem[1];
avSheetsItem[0] = wxVariant("Лист3"); 
workSheets.GetObject(sheet , wxT("Item"), 1, avSheetsItem);
Я сделал одну строчку:
C++
1
workSheets.GetObject(sheet , wxT("Item"), 1, new wxVariant[1] {wxVariant("Лист3")});
Одна строчка красивее .

Проблема:
При вызове функции (насколько я понимаю), будет создаваться переменная:
C++
1
new wxVariant[1] {wxVariant("Лист3")}
Однако никто её удалять через delete не будет - а значит память будет тикать...

Вот я и хотел узнать - есть ли другие способы создания переменной при вызове функции, причём такие чтобы память не утекала...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

На странице: http://archive.kalnitsky.org/2... -in-cpp11/

Написано, что shared_ptr лучше не использовать на лету:
При работе с умным указателем, следует опасаться их создания на лету. Например, следующий код может привести к утечки памяти.
someFunction(std::shared_ptr<Foo>(new Foo), getRandomKey());
Вместо неё пишут лучше использовать make_shared:
Почему? Да потому, что стандарт C++ не определяет порядок вычисления аргументов. Может случиться так, что сначала выполнится new Foo, затем getRandomKey() и лишь затем конструктор shared_ptr. Если же функция getRandomKey() бросит исключение, до конструктора shared_ptr дело не дойдет, хотя ресурс (объект Foo) был уже выделен.
В случае с shared_ptr есть выход — использовать фабричную функцию std::make_shared<>, которая создает объект заданного типа и возвращает shared_ptr указывающий на него.

C++
1
someFunction(std::make_shared<Foo>(), getRandomKey());
Однако у меня не получается использовать ни shared_ptr ни make_shared... Чё-то я недопонимаю.. пробую так:
C++
1
workSheets.GetObject(sheet , wxT("Item"), 1, std::make_shared<wxVariant>(new wxVariant[1] {wxVariant("Лист3")}));
Пишет ошибку:
error: no matching function for call to 'wxAutomationObject::GetObject(wxAutomationObject&, const wchar_t [5], int, std::shared_ptr<wxVariant>)'|
note: candidates are:|
note: bool wxAutomationObject::GetObject(wxAutomationObject&, const wxString&, int, wxVariant*) const|
note: no known conversion for argument 4 from 'std::shared_ptr<wxVariant>' to 'wxVariant*'|
Как я понимаю не может привести тип 'std::shared_ptr<wxVariant>' к типу 'wxVariant*'...

Я тож не знаю как, пробовал так:
C++
1
workSheets.GetObject(sheet , wxT("Item"), 1, (wxVariant*)(std::make_shared<wxVariant>(new wxVariant[1] {wxVariant("Лист3")})));
В этом случае пишет ошибку:
error: invalid cast from type 'std::shared_ptr<wxVariant>' to type 'wxVariant*'|
Однако я опять всё не так делаю?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
08.01.2016, 17:56 4
Лучший ответ Сообщение было отмечено mildok как решение

Решение

Цитата Сообщение от mildok Посмотреть сообщение
одну строчку
Лучше конечно за этим (за сокращением числа строк) не гнаться.
Сделай так. Это будет приемлемо.
C++
1
2
wxVariant avSheetsItem[1] = { wxVariant("Лист3") };
workSheets.GetObject(sheet , wxT("Item"), 1, avSheetsItem);
Добавлено через 6 минут
У этого метода, кроме всего прочего, есть одно неоспоримое достоинство. Заключается оно в том, что нам не нужно будет отдельно задавать размерность. Достаточно сделать так:
C++
1
2
3
4
5
wxVariant avSheetsItem[] = 
{ 
    wxVariant("Лист3"), wxVariant("Лист4"), wxVariant("Лист5")  
};
workSheets.GetObject(sheet , wxT("Item"), sizeof(avSheetsItem)/sizeof(*avSheetsItem), avSheetsItem);
И никаких тебе магических констант в коде.
1
19 / 0 / 0
Регистрация: 27.08.2009
Сообщений: 19
08.01.2016, 18:29  [ТС] 5
Спасибо
0
08.01.2016, 18:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2016, 18:29
Помогаю со студенческими работами здесь

Создание границы в Excel при вызове макроса из Word'а
Доброго времени суток! Проблема следующая: В Word'е выполняется макрос, который в определённый...

Ошибка при вызове функции
При вызове функции выдает ошибку - Fatal error: Call to a member function get_results() on null in...

Ошибка при вызове функции
Здравствуйте, у меня возникла проблема при вызове функции. Идея программы в том, что я вывожу...

Ошибка при вызове функции
Ошибка в строке 90, при пошаговом выполнении она появляется при вызове функции, до захода в нее,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru