Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С++/CLI не вызывается деструктор 
:(
    Опции темы
MaxWave
Дата 30.12.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Доброго времени суток!

Имеется класс:
Код

public ref class hk_Vector4
    {
    public:

        hk_Vector4(float x,float y,float z) 
        {
            p_vector= new hkVector4( x,y,z);
        }
        ~hk_Vector4()
        {
            System::Diagnostics::Debug::Print("Это не сработает");
            if (p_vector)
                delete p_vector;
        }

        hkVector4 * p_vector;
    };


Вот так он выглядит в рефлекторе:

Код

public class hk_Vector4 : IDisposable
{
    // Fields
    public unsafe hkVector4* p_vector;

    // Methods
    public unsafe hk_Vector4(float x, float y, float z)
    {
        hkVector4* vectorPtr2;
        hkVector4* vectorPtr = hkVector4.new(0x10);
        try
        {
            vectorPtr2 = (vectorPtr == null) ? null : ((hkVector4*) hkVector4.{ctor}(vectorPtr, x, y, z, 0f));
        }
        fault
        {
            ___CxxCallUnwindDelDtor(hkVector4.delete, (void*) vectorPtr);
        }
        this.p_vector = vectorPtr2;
    }

    private unsafe void ~hk_Vector4()
    {
        Debug.Print("это не сработает");
        if (this.p_vector != null)
        {
            hkVector4.delete((void*) this.p_vector);
        }
    }

    public sealed override void Dispose()
    {
        this.Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose([MarshalAs(UnmanagedType.U1)] bool flag1)
    {
        if (flag1)
        {
            this.~hk_Vector4();
        }
        else
        {
            base.Finalize();t.
        }
    }
}


Этот код находится в отдельной сборке.
Юзаю класс из C# вот так:
Код

hk_Vector4 v4 = new hk_Vector4(4,4,4);



При отладке и выходе из программы не вызывается бряк на деструкторе, и строчка не выводится в output. 
Хотя если мы имеем C# класс, то деструктор по завершении программы вызывается.
Что не так?

Это сообщение отредактировал(а) MaxWave - 30.12.2008, 17:43
PM MAIL   Вверх
nagg
Дата 30.12.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 6.1.2008
Где: Minsk

Репутация: нет
Всего: 4



В дотнете нет понятия "деструктор". есть Finalize
Реализуйте интерфейс IDisposble - и вставьте в диспоуз код деструктора
--------------------
I am the State...
PM MAIL WWW ICQ Skype   Вверх
MaxWave
Дата 30.12.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



2nagg

Вы код, сгенерированный рефлектором смотрели? 
PM MAIL   Вверх
MaxWave
Дата 14.1.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



ребят, ну так что, никто не знает чтоли???
PM MAIL   Вверх
MaxWave
Дата 14.1.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Чтож, деструктор должен быть определен как

!ClassName

Знайте, кто еще не занет, ибо именно он превращается в Finalize и вызывается сборщиком мусора.

 Но косяк теперь в другом - GC вызывает Finalize из своего потока, а это нам не подходит. :(((( Какой ууужос.... После офигевания от красот .NET начинаешь втухать от его недостатков...
PM MAIL   Вверх
nagg
Дата 14.1.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 6.1.2008
Где: Minsk

Репутация: нет
Всего: 4



Потому что C++/CLI - это, простите, порнография  smile 

--------------------
I am the State...
PM MAIL WWW ICQ Skype   Вверх
MaxWave
Дата 14.1.2009, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.