Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » ?* Теория *? Очередные хитрые вопросы по C++

Ответить
Настройки темы
?* Теория *? Очередные хитрые вопросы по C++
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Дабы сэкономить код я написал такую хитрую вещь:
Код: Выделить весь код
CFormList {
   vector<CForm*> flist;
public:
   CFormList();
   ~CFormList();
   void add(auto_ptr<CForm>);
   void erase(CForm*);
};

CFormList::~CFormList()
{
    for_each(flist.begin(), flist.end(), operator delete);
}
Компилятор не ругался, но должного эффекта не получилось. Кто из нас неправ?

Отправлено: 14:00, 04-05-2005

 

редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


У меня ругается. gcc 3.4.2. Зато
Код: Выделить весь код
for_each(flist.begin(), flist.end(), ptr_fun(operator delete));
вполне работает. Честно говоря, не знаю почему, просто где-то давно вычитал.

А ещё бы я забил на std::auto_ptr и использовал более умный указатель и не мучался. Что-нибудь из boost (shared_ptr?) по идее можно выдрать, или свой на коленке сваять.

-------
http://ivank.ru


Отправлено: 16:34, 04-05-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


А мне std::auto_ptr нравится. В примере, правда, он только для того, чтобы показать передачу владения классом. С поправкой, пожалую согласен.

Отправлено: 12:44, 12-05-2005 | #3

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


gcc, c++ 3.3.2; компилится, но не работает. Если вас не затруднит, попробуйте этот код:
Код: Выделить весь код
#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
// gcc -o test-1  test.cpp /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/libstdc++.so

class A {
	int fvalue;
	static int ginstance_count;
public:
	A() : fvalue(0)
	{
		++A::ginstance_count;
		cout << "A::A()" << endl;
	}
	~A()
	{
		--A::ginstance_count;
		cout << "A::~A()" << endl;
	}
	static void leakReport()
	{
		cout << ginstance_count << " instances alive" << endl;
	}
};

int A::ginstance_count(0);



class List {
	bool fuse_for_each;
	vector<A*> flist;
public:
	List(bool b) : fuse_for_each(b)
	{
	}
	~List()
	{
		if (fuse_for_each)
		{
			for_each(flist.begin(), flist.end(), ptr_fun(operator delete));
		}
		else
		{
			while (!flist.empty())
			{
				delete flist.back();
				flist.pop_back();
			}
		}
		cout << "List::~List result: ";
		A::leakReport();
	}
	void add(auto_ptr<A> pa)
	{
		flist.push_back(pa.release());
	}
};



int main(int argc, char*argv[])
{
	cout << "Entering the block (using for_each)" << endl;
	{
		List list(true);
		list.add(auto_ptr<A>(new A()));
		list.add(auto_ptr<A>(new A()));
		list.add(auto_ptr<A>(new A()));
	}
	cout << "Left the block" << endl;

	cout << "Entering the block (well-working code)" << endl;
	{
		List list(false);
		list.add(auto_ptr<A>(new A()));
		list.add(auto_ptr<A>(new A()));
		list.add(auto_ptr<A>(new A()));
	}
	cout << "Left the block" << endl;
}
Результат:
Код: Выделить весь код
[andrey@localhost bin]$ test-1
Entering the block (using for_each)
A::A()
A::A()
A::A()
List::~List result: 3 instances alive
Left the block
Entering the block (well-working code)
A::A()
A::A()
A::A()
A::~A()
A::~A()
A::~A()
List::~List result: 3 instances alive
Left the block
Кажется, я нечяанно ткнул в "грязный угол языка", т.к. operator delete -
единственный статический оператор, определённый для всех классов автоматически,
причём класс идентифицируется по аргументу-указателю. Непонятно, что означает
фраза ptr_fun(operator delete), т.е. &(operator delete). Для чьёго оператора
берётся адрес? List:perator delete или A:perator delete? Чей вызывается
деструктор? Непонятно, почему это откомпилировалось...

Отправлено: 13:31, 17-05-2005 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » ?* Теория *? Очередные хитрые вопросы по C++

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Очередные мошенники Jamgar Мобильные ОС, смартфоны и планшеты 4 28-08-2011 12:35
Очередные сроки выхода Windows 7 OSZone News Новости и события Microsoft 9 29-05-2009 10:05
*Теория* | Вопросы по синтаксису языка Си. Знак модуля. Hemp Программирование и базы данных 5 31-10-2005 12:47
очередные проблемы с ХР Pierre Microsoft Windows 2000/XP 14 11-02-2003 14:52
"Хитрые" картинки Vadikan Вебмастеру 5 17-11-2002 01:56




 
Переход