- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我打算写一个程序,使用虚函数做多边形计算,但是当我完成这个程序后,出现 BLOCK_TYPE_IS_VALID(pHead -> nBlockUse) 错误
// pointers to base class
#include <iostream>
#include "Polygon.h"
#include "Rectangle.h"
#include "Triangle.h"
using namespace std;
int main() {
Rectangle rect1(4, 5);
Rectangle rect2(3, 3);
Triangle tri(4, 4, false);
int triLength[3] = { 5, 4, 3 };
tri.setsideLength(triLength);
Polygon * p = &rect1;
cout << "Rectangle 1: " << endl;
cout << "\tArea: " << p->area() << endl;
cout << "\tSide: ";
p->printsideLength();
rect1.printsideLength();
cout << "\tTotal Side Length: " << p->totalsideLength() << endl;
p = &rect2;
cout << "Rectangle 2: " << endl;
cout << "\tArea: " << p->area() << endl;
cout << "\tSide: ";
p->printsideLength();
rect2.printsideLength();
cout << "\tTotal Side Length: " << p->totalsideLength() << endl;
p = &tri;
cout << "Triangle: " << endl;
cout << "\tArea: " << p->area() << endl;
cout << "\tSide: ";
p->printsideLength();
cout << "\tTotal Side Length: " << p->totalsideLength() << endl;
system("pause");
return 0;
}
这是程序的main.cpp,程序不需要输入任何东西只需要显示它的结果。
这里是三个class(cpp&h)
#ifndef Polygon_H
#define Polygon_H
#include <iostream>
using namespace std;
class Polygon{
private:
int noOfSide;
bool isAllSideEqual;
int* sideLength;
public:
Polygon();
Polygon(int n,bool s);
~Polygon();
void setsideLength(int* sl);
void printsideLength();
int totalsideLength();
virtual int area();
};
#endif
.
#include "Polygon.h"
#include <iostream>
using namespace std;
Polygon::Polygon(){
noOfSide = 3;
isAllSideEqual = false;
sideLength = new int[noOfSide];
sideLength = &sideLength[noOfSide];
};
Polygon::Polygon(int n,bool s){
if (n<3)
{
noOfSide = 3;
isAllSideEqual = false;}
else
{
noOfSide = n;
isAllSideEqual = s;
};
sideLength = new int[noOfSide];
sideLength = &sideLength[noOfSide];
};
Polygon::~Polygon(){
delete[] sideLength;
};
void Polygon::setsideLength(int* sl){
for(int i=0;i<noOfSide;i++)
sideLength[i] = sl[i];
};
void Polygon::printsideLength(){
for(int i=0;i<noOfSide;i++)
cout << sideLength[i] <<" ";
};
int Polygon::totalsideLength(){
int total = 0;
for(int i=0;i<noOfSide;i++)
total += sideLength[i];
return total;
};
int Polygon::area(){
return 0;
};
#ifndef Triangle_H
#define Triangle_H
#include <iostream>
#include "Polygon.h"
using namespace std;
class Triangle:public Polygon
{
private:
int width;
int height;
public:
Triangle(int w,int h,bool s);
virtual int area();
};
#endif
#include "Triangle.h"
#include <iostream>
using namespace std;
Triangle::Triangle(int w,int h,bool s){
width = w;
height = h;
Polygon(3,s);
};
int Triangle::area(){
int total = 0;
total = (width*height)/2;
return total;
};
#ifndef Rectangle_H
#define Rectangle_H
#include <iostream>
#include "Polygon.h"
using namespace std;
class Rectangle:public Polygon{
private:
int width;
int height;
public:
Rectangle(int w,int h);
void printsideLength();
virtual int area();
};
#endif
#include "Rectangle.h"
#include <iostream>
using namespace std;
Rectangle::Rectangle(int w,int h){
width=w;
height=h;
if(width = height)
Polygon(4,true);
else
Polygon(4,false);
int* size =new int[4];
size[0] = width;
size[1] = height;
size[2] = width;
size[3] = height;
Polygon::setsideLength(size);
};
void Rectangle::printsideLength(){
for(int i=0;i<2;i++)
cout<< width<<" "<<height <<" ";
};
int Rectangle::area(){
int total =0;
total = width*height;
return total;
};
程序没有任何编译错误,所以唯一的问题是关于内存但哪里错了?是虚函数部分错误还是其他部分?
最佳答案
有几个问题。
在你的Polygon
构造函数,第二行
sideLength = new int[noOfSide];
sideLength = &sideLength[noOfSide];
是主要错误。
它使sideLength
指向刚刚分配的内存的末尾。
使用此指针是未定义的。
你们稍后都复制到该位置并将其传递给 delete
, 两者均无效。
你只需要 sideLength = new int[noOfSide];
.
您还需要一个适当的复制构造函数和赋值运算符,因为该类是手动管理内存的。
(您真正应该做的是使用 std::vector<int>
而不再担心内存分配。)
在你的子类构造函数中,Polygon(3,s);
等等不初始化你的基类,他们创建一个未命名的 Polygon
立即丢弃。
您应该在初始化列表中初始化基类(连同您的其他成员):
Triangle::Triangle(int w, int h, bool s)
: Polygon(3, s),
width(w),
height(h)
{
}
Rectangle
的构造函数有同样的问题,增加了你使用赋值的问题,=
, 你应该在哪里使用平等,==
.
(如果您启用它的警告,您的编译器可以警告您。这样做,并听取它们。)
Rectangle::Rectangle(int w, int h)
: Polygon(4, w == h),
width(w),
height(h)
{
int size[] = {width, height, width, height};
setsideLength(size);
}
关于c++ - BLOCK_TYPE_IS_VALID(pHead -> nBlockUse)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36598722/
我遇到了这个问题: 调试断言失败! 文件:f:\dd\vctools\crt_bld\self_x86\crt\dbgdel.cpp 第 52 行 表达式“_BLOCK_TYPE_IS_VALID(p
我在这里查看了类似的问题,但仍然无法意识到我做错了什么。请帮忙。 我需要为大小有限的字符串类制作模板(就像在 Pascal 中一样)代码如下:http://pastebin.com/syZf3yM8
我打算写一个程序,使用虚函数做多边形计算,但是当我完成这个程序后,出现 BLOCK_TYPE_IS_VALID(pHead -> nBlockUse) 错误 // pointers to base c
首先,我将向您展示我的代码。 std::ifstream file("accounts/22816.txt"); if(file){ char *str[50]; int count=0;
我有一个错误“_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”,我不知道该怎么办.. person.h #ifndef _person_H #define _person
这个问题在这里已经有了答案: What is The Rule of Three? (8 个答案) 关闭 8 年前。 我知道这是一个常见错误,所以我尝试创建一个最小示例。我认为这是因为我试图释放堆栈
我在下面代码的最后一行遇到错误“_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”: pixelCoorindateAndThreePoint* tempSpace = n
这个问题在这里已经有了答案: What is the behavior of "delete" with stack objects? [duplicate] (1 个回答) 关闭 6 年前。 我是
我正在尝试修复一个非常严重的内存泄漏,但不知何故我无法在不触发此断言的情况下删除对象。 我已通过 Google 搜索了解决方案,并已阅读有关此错误的 Stackoverflow 上的问题,但我仍然无法
我一直在从事一个新项目,但遇到了一个我不知道为什么会失败的问题。 当我执行此行删除 textY 时,给我错误 _Block_Type_Is_Valid (pHead->nBlockUse)。那我做错了
我正在调用一个静态链接的 .dll,我看到了这个错误: 我编写了 .dll 和调用代码。不应发生此错误。我想知道是否有人以前遇到过它? .dll 仅包含大约 10 行代码,它只是一个测试 .dll,以
我想弄清楚为什么我的程序在运行时会失败。到目前为止,当我运行我的程序时,它对我失败了。我调试了错误,它把我带到了 dbgdel.cpp。第 32 行“_ASSERTE(_BLOCK_TYPE_IS_V
我正在编写一个类似于电影信息系统的程序。我是 C++ 的初学者。 每次编译后我都会收到此错误警报消息。我确信在 detructor 调用时它会出错。 我阅读了很多与此错误相关的帖子。但我还是忍不住。我
我不知道为什么我总是收到 _Block_Type_Is_Valid (pHead->nBlockUse) 错误。我知道这通常是因为我双重删除了一些东西但我只在代码中使用了一次删除。以下是代码。 Box
我知道有几篇关于此错误的帖子,但它们都是针对特定情况的。我正在制作一个文件拆分/连接器,它具有以下要求:-用户必须输入文件名/输入路径和输出文件夹。我用将原始文件拆分为 N 部分(用户必须输入)的基本
我现在很迷茫。我做了一个 vector 类。一切都按照我希望的方式工作,直到最后。当调用析构函数时,我收到一条错误消息:调试断言失败 BLOCK_TYPE_IS_VALID(pHead->nblock
我正在使用以下代码进行背景减除。我正在为其提供视频路径,视频运行成功但最后它给出了Debug Assertion Failed 错误。 我在 Microsoft Visual Studio 中使用以下
通过引用“_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”添加参数后调试断言失败。 class Stack { private: const std::uint3
我知道这个问题在这些论坛上被评估过很多次,但大多数时候它们确实是针对特定案例的。 这是一个类(class)项目(同样使用 C++),该项目的目的是重制经典棋盘游戏 Reversi。 我辛苦编写了几个小
此错误发生在运行时,我不确定是什么原因导致的 - 代码对我来说看起来是正确的。 #include #include using namespace std; struct Room { i
我是一名优秀的程序员,十分优秀!