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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2013, 12:06   #1
Manya
Пользователь
 
Регистрация: 22.10.2008
Сообщений: 13
По умолчанию dll, классы и динамическая память

Создаю класс в dll-ке с двумя переменными pF и pD - одна общая, другая скрытая.
Код:
class _declspec(dllexport) Test
{
public:
	PBYTE pF;
	Test();
	~Test();

	void Function();
private:
	PBYTE pD;
	void TestFunc();
};
Тексты функций:
Код:
Test::Test()
{
	pF=NULL;
	pD=NULL;
}
Test::~Test()
{
	if (pF!=NULL)
	{
		delete pF;
		pF=NULL;
	}
	if (pD!=NULL)
	{
		delete pD;
		pD=NULL;
	}
}
void Test::Function()
{
	pF=new BYTE [15];
	pD=new BYTE [15];
	TestFunc();
}
void Test::TestFunc()
{
	int i;
	for (i=0; i<15; i++)
		*(pF+i)=0;
}
Далее, когда я подключаю эту dll к своей программе, я описываю в этом классе только общие методы-атрибуты, скрытые не указываю. И дальше работаю с переменными этого типа.
Код:
class _declspec (dllimport) Test
{
public:
	PBYTE pF;
	Test();
	~Test();
	void Function();
//private:
//	PBYTE pD;
};
Код:
void CNewCreativeDoc::OnTestDLL() 
{
	Test obj;
	obj.Function();
}
Но в конце работы функции OnTestDLL возникает ошибка "Run-Time Check Failure #2 - Stack around the variable 'obj' was corrupted." Опытным путем выяснила, что ошибка из-за того что деструктор удаляет скрытую переменную pD. Проблема решается, если в описании класса в программе указываю что есть такая скрытая переменная pD (в примере сейчас закоментировано), но я ведь для того и делала эту переменную скрытой, т.к. не хочу чтобы ее видели вне моей dll-ки. Может есть какой-то другой способ очищения динамической памяти при уничтожении элемента класса, чтобы не объявлять скрытую переменную?
Manya вне форума Ответить с цитированием
Старый 15.05.2013, 13:05   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Нет, нельзя не указывать скрытую переменную. Описывать класс в двух местах - себе дороже - оба класса должны быть одинаковы. Если так важно скрывать подробности, сделайте либо скрытый второй класс, который не экспротируется и созадавайте его динамичически в публичном классе либо просто сделайте публичным интерфейс (пустой класс) и factory метод, который опять таки будет создавать скрытый класс, который данный интерфейс имплементирует.
waleri вне форума Ответить с цитированием
Старый 15.05.2013, 14:38   #3
Manya
Пользователь
 
Регистрация: 22.10.2008
Сообщений: 13
По умолчанию

Спасибо! Т.е. получается что когда я в программе описываю этот класс - все его скрытые методы тоже лучше бы описать. Просто у меня помимо всего много скрытых функций, которые не описаны и проблем с их работой не возникает - это мне так везет и на другом компе при других условиях из-за этого могут выпадать ошибки? Или может есть какой-то другой способ подключения класса из dll чтобы не описывать его второй раз?
Manya вне форума Ответить с цитированием
Старый 15.05.2013, 18:28   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Методы класс не влияют на его размер, поэтому не влияют.
Описание класса должно быть одно для всех, и для DLL и для тех, кто им пользуется (т.е. один .h файл для всех). Обычно условной компиляцией вставляют директиву для експорта, когда файл исползуется для сборки DLL-а.
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая память vladxxl Общие вопросы C/C++ 0 25.04.2011 20:04
Динамическая память zhenya.ya Помощь студентам 1 22.09.2010 08:43
Динамическая память. spotmc13 Паскаль, Turbo Pascal, PascalABC.NET 5 20.09.2010 17:08
динамическая память в си Serjuk Помощь студентам 0 27.12.2009 13:54