2013-05-18 5 views
1
class Base 
{ 
private: 
    int nID; 
    friend int fnDeleteBase(Base* base); 
public: 
    Base(int baseID):nID(baseID) { cout << "Base Constructed with value" << endl; } 
    Base() : nID(5){cout << "Base Constructed WITHOUT value" << endl; } 
    ~Base() { cout << "Base class object killed " << endl; } 
}; 

int fnDeleteBase(Base* base)       // Line 1 
{ 
    delete base;          // Line 2 - important 
    cout << "Base object deleted " << endl; 
    return (1); 
} 

int main() 
{ 
    Base aBase;          // Line 3 
    try 
    { 
     int i = fnDeleteBase(&aBase);     // Line 4 
    } 
    catch(...) 
    { 
     cout << "Exception handled " << endl; 
    } 

    return (0); 
} 

Вышеупомянутый фрагмент кода, который я отлаживал. Я не могу войти в строку 2, где я удаляю базовый объект. как только я пытаюсь шагнуть или запустить через линию 2, управление идет и я должен убить отладки или выполненияЯ теряю контроль и не могу отлаживать

Выход я получаю:

Base Constructed (any of the construction is valid) 
Base class Object killed 

Однако все работает отлично, и если Строка 3 изменена на Base * aBase = new Base();. Выход на консоли:

Base Constructed (any of the construction is valid) 
Base class Object killed 
Base object Deleted 

Может ли кто-нибудь поделиться техническими данными позади двух?

+1

какая среда программирования вы используете, Rajesh? –

+0

visual studio ultimate 2010 –

+0

BTW Я сначала попробовал fnDeleteBase с аргументом в качестве ссылки на базу. результат был таким же, как в первом случае. то я попытался с указателем. –

ответ

4

Вы должны только использование delete на указателях, которые были построены с использованием new (или указателей, которые назначены для других указателей, которые были построены с использованием new), никаких исключений (что я знаю).

delete Использование на что-либо другое (что и происходит в первом случае, так как параметр fnDeleteBase является указателем на Base aBase, который не является указателем и нет new ключевого слова есть) приводит к неопределенному поведению.

Объяснение, что именно делает компилятор, действительно не будет полезным, так как с неопределенным поведением это может отличаться от компилятора к компилятору. И его следует избегать любой ценой.

+0

просто любопытно, это объектно-ориентированное программирование. Должно ли это иметь значение в том, как я создаю объект. Я просто создал указатель на объект и удалю его. –

+0

Спасибо, Герцог, ваш ответ имеет смысл. Теперь я получил его тоже, с новым мы создаем объекты в куче, в то время как локальный объект области удаляется сами, и удаление требуется для объектов в куче –

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