2017-03-29 3 views
1

응용 프로그램이 힙 끝 뒤에서 메모리에 쓴 것으로 "디버그 오류"CRT가 발생했습니다. 그러나 나는 왜 그런지 이해하지 못하고 어떤 비슷한 예도 찾을 수 없다.힙 버퍼 (새/삭제) 클래스 끝에서 응용 프로그램이 메모리에 썼음을 감지했습니다.

전체 코드는 ... 하지만 메인과 관련된 문제 일 수 있습니다.

#include <iostream> 
#include <cmath> 
#include <array> 

using namespace std; 
// Declare global consts 
const double pi = 3.1415926583; 


// Base class Shape 
class Shape{ 
protected: 
    double *sides; 
public: 
    Shape(const int n){ //parameterized for n dimensional shape 
    sides = new double[n]; 
} 
// need virtual destructor 
virtual ~Shape(){ 
    delete[] sides; 
} 
virtual double area() const = 0; // pure virtual function for area 
virtual double volume() const = 0; // pure virtual function for volume 
}; 

////////////////////////////////////////////////////////// 
//Derived classes for 2D and 3D Shapes 
class Shape2D : public Shape{ // inherit shape 
protected: 
    int n = 2; //n denotes the number of dimensions 
public: 
    // default constructor 
    Shape2D() :Shape(n){} 
    // param constructor 
    Shape2D(const double side1, const double side2) :Shape(n){ 
     sides[0] = side1; sides[1] = side2; 
    } 
    virtual ~Shape2D(){} //virtual destructor 
    double volume() const { cout << "trying to calculate volume of 2d shape..." << endl; return 0; }; 
}; 

///////////////////////////////////////////////////////////////////// 
//2D shapes 
class Rectangle : public Shape2D{ 
public: 
    // constructors 
    Rectangle() :Shape2D() {} 
    Rectangle(const double side1, const double side2) :Shape2D(side1, side2){} 
    ~Rectangle(){} 
    double area() const { return (sides[0] * sides[1]); } 
}; 

int main(){ 
    Shape **ShapePointer = new Shape*[2]; 
    ShapePointer[0] = new Rectangle(2, 5); 
    ShapePointer[1] = new Rectangle(1, 3); 
    // clean up 
    delete ShapePointer[0]; 
    delete ShapePointer[1]; 
    delete[] ShapePointer; 
    system("pause"); 
    return 0; 
} 
+0

관련없는 (아마도) 나는 ShapePointer의 필요성을 알지 못합니다. Shape * ShapeArray [2] = {새로운 직사각형 (...), 새로운 직사각형 (...)}' –

+0

과 같이'Shape'에 대한 일반적인 포인터 배열을 가지고 있습니다. 발행물. – Toby

+0

더 많은 질문과 관련하여 디버거에서 실행할 수 없으며 프로그램을 실행할 때 오류를 잡을 수 있습니까? 그런 다음 코드에서 어디에서 발생하는지 찾을 수 있어야합니다. 또는 최소한 디버그 로깅을 추가하여 범위를 좁히는 데 도움이됩니까? –

답변

4

위험 !!! 당신이 static constn 정의 할 수 있습니다 경우

Shape2D(const double side1, const double side2) :Shape(n) 

Shape(n)

같은 문제를 초기화 할 때

protected: 
    int n = 2; //n denotes the number of dimensions 
public: 
    // default constructor 
    Shape2D() :Shape(n){} 

n

은 정의 (또는 static constexpr 당신이 태그 때문에, C++ 11)

protected: 
    static constexpr int n = 2; //n denotes the number of dimensions 

그렇지 않으면 2 값을 가진 고정 const/constexpr 변수 (예 : nDef)를 정의하고이 상수와 함께 nShape()을 초기화해야합니다.

어쨌든, 지금 Shape (Shape2D 기본 클래스는)n 전에 을 초기화 카운트 받아, ​​해당 클래스의 멤버이다.

+0

그게 다야, 고마워. – Toby

1

문제는 다음 두 줄의 코드입니다 : int n = 2; //n denotes the number of dimensions Shape2D(const double side1, const double side2) :Shape(n){ ... }

문제는 n가 초기화되기 전에 Shape()이 실행됩니다이다. 자세한 내용은 constructors-called-before-initializing-variables을 참조하십시오. 이에 용액에

protected: 
void InitializeBuffer(const int n) 
{ 
sides = new double[n] 
} 

Shape 클래스에서 다음과 같은 방법을 생성하고 대신 부모 생성자에서 sides를 초기화 할의 Shape2D 클래스

의 생성자와이 InitializeBuffer 전화
Shape2D(const double side1, const double side2) :Shape() 
{ 
    InitializeBuffer (n); 
    sides[0] = side1; sides[1] = side2; 
}