2013-11-10 3 views
0

main.cppотладки Утверждение Сбой в таком простом примере

#include <iostream> 
#include "Simple.h" 

using namespace std; 

int main() 
{ 
    Simple s; 
    s = Simple(); 
} 

Simple.cpp

#include "Simple.h" 

Simple::Simple(void) 
{ 
    ptr = new int[10]; 
} 


Simple::~Simple(void) 
{ 
    delete [] ptr; 
} 

Simple.h

#pragma once 
class Simple 
{ 
public: 
    Simple(void); 
    ~Simple(void); 

private: 
    int* ptr; 
}; 

При запуске главной .cpp, progra м останавливается и возвращает ошибку:

Microsoft Visual C++ Debug Library Debug Assertion Failed!

Program: ...ts\Visual Studio 2010 C++\simple error\Debug\simple error.exe File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp Line: 52

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

Почему это происходит в таком распространенном примере?

+1

Взгляните на [правило 3] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) –

ответ

3

Вам необходимо добавить конструктор копирования и оператор присваивания. На данный момент, ваша линия

s = Simple(); 

выполняет следующие действия:

  • Создает временный Simple, выделения памяти для его указатель, чтобы указать.
  • Назначает его s, который просто копирует указатель напротив временного.
  • Уничтожает временные снова, освобождая память, на которую указывает указатель во временном и указатель в s.

На данный момент указатель в s указывает на освобожденную память. Когда s выходит из области видимости, дескриптор Simple пытается освободить память указателя s, и появляется неопределенное поведение (в вашем случае ваша программа вылетает из строя).

+0

Большое спасибо за ответ clarying. – user2551229

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