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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2010, 00:13   #1
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
Хорошо самописный assert: проблема с утечкой памяти)

Привет!

возникла необходимость разработать класс, заменяющий классический assert.
Код:
#ifndef ENFORCER_H
#define ENFORCER_H
#include <string>
#include <strstream>
#include <Windows.h>
class Enforcer
{
public:
  Enforcer(bool exp): m_exp(exp){}

  void operator ! () 
  {
    if (!m_exp)   
      throw std::exception(m_msg.c_str());   
  }

  template<typename T> 
  Enforcer& operator () (T val)
  {
    std::strstream stream;
    stream << val;
    m_msg.append(stream.str(), stream.pcount());
    return *this;
  }
private:
  std::string m_msg;
  bool m_exp;
};

#define _MUST(exp) !Enforcer(exp)("критическая ошибка!\nутверждение: '")(#exp)("' ложно\n")(__FILE__)(" в строке ")(__LINE__)('\n')
#define MUST(exp) _MUST(exp)

#endif

чтобы было понятнее как это работает поясню. при использовании макроса MUST создается объект Enforcer c булевым параметром exp. Затем последовательно выполняются перегруженные операторы (), а после этого - перегруженный оператор !, который в случае ОШИБОЧНОСТИ выражения exp бросает исключение с сообщением m_msg, в котором указывается имя файла и номер строки, где был поставлен MUST .

пример кода

Код:
#include <iostream>
using namespace std;

void main()
{
  try
  {
   cout << "Введите неотрицательное число " << endl;
   int a;
   cin >> a;
   MUST(a>=0)("Число должно быть положительным!") ;
  }
  catch(expression e)
  {
    cout << e.what();
  } 
}
в результате при вводе отрицательного числа получам в консоли
"критическая ошибка!
утверждение 'a>=0' ложно!
main.cpp в строке 8
Число должно быть положительным!"

Проблема в утечке памяти. При использовании этого макроса с оператором круглых скобок (), память течет пропорционально размеру данных, переданных как параметры в оператор (). Не могу разобраться, изза чего может течь память, если есть соображения, прошу поделиться
sashonk вне форума Ответить с цитированием
Старый 26.04.2010, 09:50   #2
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

Вероятно создаваемые экземпляры объекта не удаляются после работы.
evgn вне форума Ответить с цитированием
Старый 26.04.2010, 15:58   #3
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

Цитата:
Сообщение от evgn Посмотреть сообщение
Вероятно создаваемые экземпляры объекта не удаляются после работы.
разумеется, остается только понять в каком месте...

здесь вообще указатели не используются, здесь все на стеке создается

Последний раз редактировалось Stilet; 26.04.2010 в 16:06.
sashonk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема выделения динамической памяти в С++ oxygen90 Помощь студентам 3 14.09.2009 21:47
if && assert artush1984 Общие вопросы C/C++ 2 25.05.2009 02:29
Контроль памяти FW-TOT Помощь студентам 2 15.11.2008 14:04
Место в памяти. Манжосов Денис :) Помощь студентам 3 24.09.2008 15:35
Чистка памяти Shouldercannon Общие вопросы Delphi 2 18.07.2008 11:28