Тема: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

1. Создаю свой класс:
-в заголовочном файле среди прочего-

class AsdkMkrEntity : public AcDbEntity
{
public:
...
   AsdkMkrEntity(const char * sd);//Конструктор
...
private:
   const char *m_Name;
...

2. -в .срр файле-

...
AsdkMkrEntity::AsdkMkrEntity(const char * sd)
: m_Name ("")
{
    m_Name = sd;
}
...
Adesk::Boolean
AsdkMkrEntity::worldDraw(AcGiWorldDraw* mode)
{
    assertReadEnabled();
        mode->geometry().text(m_center, norm, dir, txtHeight, 1.0, 0.0, m_Name);
}
...

3. -в теле программы-

AsdkMkrEntity* pEnt = new AsdkMkrEntity(Name);

Вопрос, дает ошибку внутри функции worldDraw???

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

1) Нужно уточнять какую именно ошибку дает wink
2) Если функция описана, как возвращающая значение, то она должна его вернуть, т.е. в ней не хватает:

return Adesk::kTrue;

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

 return Adesk::kTrue;

- есть...
опытным путем вычислил что при выполнении

mode->geometry().text(m_center, norm, dir, txtHeight, 1.0, 0.0, m_Name);

акад вылетает и дает ошибку:
FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at 65174883h

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

> Миша
Теперь понятно. Ты передаешь в конструктор указатель на строку. Если она - локальная переменная в функции, которая создает объект твоего класса, то в момент вызова worldDraw() m_Name ссылается на недоступную область памяти, что как раз и приводит к защите памяти. Используй в конструкторе m_Name = strdup(sd); а в деструкторе: free(m_Name);

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

:)) ок, коротко и понятно !! спасибо

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

> Александр Ривилис

> Миша
Всё таки, лучше использовать std::string. При программировании на С++ С-строк лучше избегать (от греха подальше).

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

> archimag
Теоретически - абсолютно верное змечание. Практически - не совсем. В частности в ObjectARX 2000-2002 ребята из Autodesk рекомендовали не использовать STL (и в частности std::string) в DBX-файлах. Вместо std::string рекомендовали CString из MFC. Ну а в последних версиях AutoCAD и ObjectARX рекомендуется использовать в качестве альтернативы C-ишным строкам класс AcString (особенно в custom entity).

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

> Александр Ривилис
Очевидно, эти рекомендации были связаны с корявой реализацией STL в VC++6.0 (широко известны связанные с этим проблемы при использовании страндартных контейнеров в dll), но проблема решалась подключением нормальной версии stl (например, STLPort). В VC++7.0 и выше этой проблемы уже нет.
MFC это вечный источник проблем. Я видел несколько проектов, которые не удалось перенести в 7-ю студия из 6-ой, именно, из-за проблем с CString: реализация этого класса довольно значительно изменилась.
С классом AcString не знаком (признаться, не могу даже найти его в документации), но... Лично я, при наличии нескольких альтернатив, всегда предпочитаю компонент, который поддерживается стандартом С++. Помимо этого, использование std::string (std::wstring) облегчает применение библиотек (как сторонних, так и внутренних), которые не имеют к Автокаду никакого отношения.

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

> archimag
Еще раз повторюсь. Я со всем вышесказанным Вами согласен теоретически...

С классом AcString не знаком (признаться, не могу даже найти его в документации)

В ObjectARX 2006 SDK Help запусти поиск AcString. Он производный от AcHeapOperators, который:

This class provides local new and delete operators to any class that derives from it. Starting in ObjectARX for AutoCAD 2004, this class is a second base class for AcDbObject and replaces the local new and delete operators for AcDbObject.
Objects that inherit from AcHeapOperators are guaranteed to be allocated on the AcDb heap. AcHeapOperators resolves memory allocation conflicts for objects in applications that are built with a version of the C runtime library that differs from the one used by AutoCAD's memory manager.
Classes that override the AcDbObject::new and delete operators should not require changes to accommodate the AcHeapOperators derivation.
Applications that define objects that do not inherit from AcDbObject--for instance, those that derive from AcGiDrawable or directly from AcRxObject--may derive from AcHeapOperators to gain minor performance benefits, and to avoid memory conflicts between different versions of the C runtime library. The implementation of AcHeapOperators is exported in acdb16.lib.

Так что в dbx-файлах IMHO лучше использовать его. Есть еще один нюанс, связанный с надвигающейся очередной версией AutoCAD, в которой снова IMHO лучше всего будет использовать именно его. Именно std::string там во многих местах точно будет неприменим. Увы, но большего сказать не могу... Надеюсь, что намек будет понят правильно. smile

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

> Александр Ривилис
Значит я не зря интуитивно прочувствовал что STL (при всем к нему уважении) лучше в ObjectARX не использовать...
А класс аля CString - я сам написал (Обозвал ArxString). Его и юзаю... подходит везде во всех студиях...

Re: Ошибка: "FATAL EROR: Unhandled Access Violation Reading 0x8a5fec8 Exception at ..."

> KonstantinM
Я видимо слишком завуалировал свой намек.  Речь шла только о совершенно конкретном классе.
Про STL вообще я ничего плохого не говорил, хотя реализация его в MS VS 6.0 действительно была отвратной и вызывала проблемы в arx-файлах.