CRT 检测到应用程序在堆缓冲区(新建/删除)类结束后写入内存
CRT detected that the application wrote to memory after end of heap buffer (new/delete) classes
我收到"调试错误"CRT 检测到应用程序在堆结束后写入内存。但我不明白为什么,也找不到任何类似的例子。
完整代码是...虽然我认为这可能只是main的问题。
#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;
}
危险!!
protected:
int n = 2; //n denotes the number of dimensions
public:
// default constructor
Shape2D() :Shape(n){}
初始化n
时未定义Shape(n)
同样的问题
Shape2D(const double side1, const double side2) :Shape(n)
如果可以,请将n
定义为static const
(或static constexpr
,因为您标记了 C++11(
protected:
static constexpr int n = 2; //n denotes the number of dimensions
否则,您应该定义一个静态const
/constexpr
变量(例如nDef
(,值为 2
,并使用此常量初始化 n
和 Shape()
。
无论如何,现在,Shape
(Shape2D
的基类(在n
之前初始化,这是类的成员。
问题出在以下两行代码上: int n = 2; //n denotes the number of dimensions
Shape2D(const double side1, const double side2) :Shape(n){ ... }
问题是Shape()
在初始化n
之前执行。有关详细信息,请参阅在初始化变量之前调用的构造函数。
要解决此问题,请在Shape
类中创建以下方法
protected:
void InitializeBuffer(const int n)
{
sides = new double[n]
}
而不是在父构造函数中初始化sides
,而是在 Shape2D
类的构造函数中调用此InitializeBuffer
Shape2D(const double side1, const double side2) :Shape()
{
InitializeBuffer (n);
sides[0] = side1; sides[1] = side2;
}
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 删除映射和分割错误中的一个过去结束元素
- C++ 从具有开始位置和结束位置的列表中删除
- 防止我的向量在调用它的函数结束时被删除
- f流删除特定的开始到结束行
- 取代表开始/结束的数字对,并删除重叠
- 如何有效地从C++集中删除开始和结束元素
- 如何将项目属性设置为删除警告MSB8004:中间目录不会以落后的斜线结束
- 射击时从列表中删除外星人 - 找出循环;"表达式:无法递增结束列表迭代器"
- CRT 检测到应用程序在堆缓冲区(新建/删除)类结束后写入内存
- 删除不会在函数结束时释放内存
- 当删除列表元素时,在迭代器结束时会发生什么
- 如何删除此代码输出的结束空格
- For 循环结束自身并终止正在运行的程序,但在删除斜率计算语句时正常运行
- 我应该在程序结束时删除C++中的大树集合,还是把它留给操作系统
- 如果由于接收对象的线程已结束而未处理Qt信号,参数会被删除吗?
- 如何在创建范围结束时自动从单一实例管理器类中删除shared_ptr
- 如果我在使用新的和结束的程序分配数据后没有调用删除运算符,会发生什么情况?