Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2011, 20:49   #11
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Да, просто использую их вместо malloc.
Вопрос был не в этом. Если у вас нет ни одного указателя-члена, то варианта два:
  1. Вы используете глобальные переменные. Не делайте так.
  2. Указатели передаются между функциями исключительно как аргументы и возвращаемые значения. В таком случае постарайтесь, чтобы каждая пара new/delete находилась в пределах одной функции.
Есть еще одно решение, железное - использовать умные указатели. Чем вам не подходит?
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 02.11.2011, 20:52   #12
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Сообщение от L6go1as Посмотреть сообщение
А каким образом? Путем исследования кода или можно как ни будь посмотреть (скажем программкой какой ни будь) ?
Есть и программы специальные, гляньте статью в Википедии (ссылка), но иногда они не в состоянии отследить все возможные пути выполнения программы - тогда следует искать утечки вручную. Сначала выделять возможные действия, в ходе которых из программы утекает память, а затем пошаговым отладчиком сверять вызовы new/delete.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 02.11.2011, 20:53   #13
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию

Цитата:
Вы используете глобальные переменные
Да, в качестве глобальной переменной используется указатель.

Умные указатели использовать не получится, т.к. мне необходимо использовать данные переменные в разных функциях.
YourLastSong вне форума Ответить с цитированием
Старый 02.11.2011, 20:56   #14
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Сообщение от YourLastSong Посмотреть сообщение
Да, в качестве глобальной переменной используется указатель.
Паттерн Singleton вам в помощь. Никогда не используйте глобальные переменные.
Цитата:
Сообщение от YourLastSong Посмотреть сообщение
Умные указатели использовать не получится, т.к. мне необходимо использовать данные переменные в разных функциях.
И что? Поищите что-нибудь про boost::shared_ptr - этот класс позволяет нескольким указателям ссылаться на один объект.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 02.11.2011, 21:00   #15
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Паттерн Singleton вам в помощь. Никогда не используйте глобальные переменные.
Почему?

Цитата:
И что? Поищите что-нибудь про boost::shared_ptr - этот класс позволяет нескольким указателям ссылаться на один объект.
Передавать его в качестве аргумента всем функциям?
YourLastSong вне форума Ответить с цитированием
Старый 02.11.2011, 21:02   #16
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Почему?
Ну, для начала, из-за возможных утечек памяти. (Тут должен быть закадровый смех).
Цитата:
Передавать в качестве аргумента всем функциям?
Как вам угодно. Суть в том, что вы сможете вообще забыть об освобождении памяти - умный указатель все сделает за вас (при грамотном использовании).
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 02.11.2011, 21:03   #17
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

2 YourLastSong
А как диспетчер задач помогает в идентификации утечек памяти? (просто любопытно)

2 Сtrl
А что не так с глобальными переменными? Почему нельзя?
f.hump вне форума Ответить с цитированием
Старый 02.11.2011, 21:06   #18
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Ну, для начала, из-за возможных утечек памяти. (Тут должен быть закадровый смех).
Каким образом они будут возникать? Можно подробнее, пожалуйста?

Цитата:
Как вам угодно. Суть в том, что вы сможете вообще забыть об освобождении памяти - умный указатель все сделает за вас (при грамотном использовании).
Передавать в функции будет очень неудобно.

Цитата:
А как диспетчер задач помогает в идентификации утечек памяти? (просто любопытно)
Смотрю на колонку memory. Или так делать не надо?
YourLastSong вне форума Ответить с цитированием
Старый 02.11.2011, 21:07   #19
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
А как диспетчер задач помогает в идентификации утечек памяти? (просто любопытно)
Он показывает количество используемой памяти. Если это самое количество стремительно увеличивается - утечка.
Цитата:
Сообщение от f.hump Посмотреть сообщение
А что не так с глобальными переменными? Почему нельзя?
Ну, слово "нельзя" - глупое. Просто глобальные переменные - очень плохая практика, как goto. Есть более надеждные альтернативы, которые дают тот же результат (как, к примеру, паттерн Singleton).
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 02.11.2011, 21:20   #20
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Каким образом они будут возникать? Можно подробнее, пожалуйста?
Ну у вас точно как-то возникают.
Цитата:
Передавать в функции будет очень неудобно.
А если заменить функции на функторы? Я, конечно, не знаю всей ситуации, но при использовании функторов есть возможность создавать переменные, общие для нескольких функций. Например, у нас три функции - A, B и C. Функции A и B вызываются только из C, и при этом используют указатель p. Код примерно такой:
Код:
int* p //глобальная переменная
void A(int x) {cout << x + *p; delete p;}
void B(float y) {cout << y - *p; delete p;}
void C(int x, float y)
{
  p = new int(3);
  A(x); B(y);
}
Заменим на функтор, получится что-то такое:
Код:
class FunctorC
{
public:
  FunctorC() : p(0) {p = new int(3);}
  FunctorC(const FunctorC&right) : p(0) {p = new int(*right.p);}
  FunctorC& operator=(const FunctorC&right) {delete p; p = new int(*right.p); return (*this);}
  ~FunctorC() {delete p;}
  void operator()(int x, float y) {A(x); B(y);}
protected:
  void A(int x) {cout << x + *p;}
  void B(float y) {cout << y - *p;}
  int* p;
};
Ищете информацию по C++?
cplusplus.com

Последний раз редактировалось Сtrl; 02.11.2011 в 21:36.
Сtrl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечки памяти volod3000 Общие вопросы Delphi 0 22.06.2011 00:08
утечки памяти KOLANICH Общие вопросы C/C++ 3 30.01.2011 00:15
Утечки памяти. c++ learner Общие вопросы C/C++ 3 29.11.2010 15:01
Достали утечки памяти Порфирий Общие вопросы C/C++ 4 22.12.2009 11:32
InterBase 7.1 - утечки памяти. pushkin42 БД в Delphi 2 21.03.2007 16:15