2016-10-18 16 views
0

Мне нужно использовать класс C++ в коде C.Использование классов C++ в C: Как правильно написать какую-то функцию «удалить/удалить»?

С таким C++ класс:

class MyClass 
{ 
public: 
    void myFunction() 
    { 
     cout << "Value = " << m_value; 
    } 

private: 
    int m_value; 
}; 

У меня есть следующая обертка:

typedef void CMyClass; 

#ifdef __cplusplus 
extern "C" { 
#endif 

CMyClass * new_MyClass(); 
void c_myFunction(const CMyClass * ptr); 
void c_dispose(???); // to delete/destruct 

#ifdef __cplusplus 
} 
#endif 

// implementation below: 

CMyClass * new_CMyClass() 
{ 
    MyClass * ptr = new MyClass(); 
    return (CMyClass*)ptr; 
} 

void c_myFunction(const CMyClass * ptr) 
{ 
    MyClass * tmp = (MyClass*)ptr; 
    tmp->myFunction(); 
} 

void c_dispose(???) 
{ 
    /* ??? */ 
} 

Я хотел бы только, чтобы убедиться, что у меня не будет никаких проблем, как утечки памяти, зомби указатели , с моей функцией c_dispose.

Как правильно написать полный код для c_dispose(???) для удаления ранее созданного (с new_CMyClass()) экземпляра объекта?

+1

http://stackoverflow.com/questions/14815274/how-to-call-a-c-method-from-c – sanjay

ответ

3

Возможное решение состоит в том, чтобы просто вызвать delete после того, как вы выбрали тип C для класса C++.

void c_dispose(CMyClass * ptr){ 
    MyClass * tmp = (MyClass*)ptr; 
    delete tmp; 
} 
+0

ли этого достаточно? Нет необходимости в указателе NULL? ... –

+0

Вы можете установить 'ptr' в NULL, если хотите. Но если вы этого не сделаете, память все равно будет освобождена. –

+0

@groenhen: указатели обнуления в целом являются очень неэффективной практикой. Это дает ложное чувство безопасности (что, возможно, хуже, чем отсутствие безопасности вообще), поскольку обнуление одного указателя после его освобождения не порождает всех его копий ... которые теперь свисают. Единственная причина, по которой нулевой указатель после освобождения его указателя - это «переработать» его позже, что требует поддержания его в среднем. –

 Смежные вопросы

  • Нет связанных вопросов^_^