- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
此错误发生在运行时,我不确定是什么原因导致的 - 代码对我来说看起来是正确的。
#include <iostream>
#include <string>
using namespace std;
struct Room {
int d_noSeat;
bool d_hasProjector;
Room() = default;
Room(const Room& r);
};
class Event {
Room* d_room;
std::string d_name;
public:
Event();
Event(const Event& e);
~Event();
void set(Room r, const std::string& name);
void print();
};
Event::Event() : d_room(0), d_name("") {};
void Event::print() {
std::cout << "Event: " << d_name;
if (d_room != 0) {
std::cout << " in size " << d_room->d_noSeat;
if (d_room->d_hasProjector)
std::cout << " with";
else
std::cout << " without";
std::cout << " projector";
}
std::cout << std::endl;
return;
}
void printEvent(Event e) {
e.print();
return;
}
void Event::set(Room r, const std::string& name) {
d_room = &r;
d_name = name;
}
// Room shallow copy constructor
Room::Room(const Room& r) :
d_noSeat(r.d_noSeat),
d_hasProjector(r.d_hasProjector)
{ }
// Event deep copy constructor
Event::Event(const Event& e) :
d_name(e.d_name),
d_room(new Room(*e.d_room))
{ }
// Event destructor
Event::~Event()
{
delete[] d_room;
}
int main() {
const int noLect = 5;
Room r;
Event lectures[noLect];
for (int i = 0; i < noLect; ++i) {
r.d_noSeat = i + 1;
r.d_hasProjector != r.d_hasProjector;
lectures[i].set(r, "CSI2372");
lectures[i].print();
}
std::cout << "-------------------" << std::endl;
for (int i = 0; i < noLect; ++i) {
printEvent(lectures[i]);
}
return 0;
}
错误显然发生在第 52 行(print() 函数的第一行)。除此之外,打印的文本显示的数字非常大且通常为负数。这是什么原因造成的?
最佳答案
void Event::set(Room r, const std::string& name)
{
d_room = &r;
// ^
d_name = name;
}
您正在引用临时对象:Room r
按值传递,它在作用域结束时被销毁:}
。
相反,您必须重新分配成员指针:
d_room = new Room(r);
因为您在 C++ 类中编写 C 风格的代码。
在 C++ 中,我们倾向于:
避免裸指针,更喜欢智能指针:
class Event
{
std::shared_ptr<Room> d_room;
...
Event::~Event() { /* no need to delete */ }
使用构造函数重载(而不是在构造后使用类似set
的函数):
Event(Room& r, const std::string& name):
d_room(new Room(r)),
d_name(name)
{}
通过引用传递:
void set(Room& r, const std::string& name);
避免原始数组,改用 STL 工具:
std::vector<Event> lectures;
// or
std::array<Event, 5> lectures;
r.d_hasProjector != r.d_hasProjector;//检查 r.d_hasProject 是否不是它自己
你可能想要
r.d_hasProjector = !r.d_hasProjector;
完整代码: link
此外,这里有一个关于高级 C++ 内容的必读链接,我相信它对您非常有用:http://www.parashift.com/c++-faq/
编辑:我忘记了你的问题:
In addition to this, the printed text displays numbers that are very large and often negative. What is causing this?
那些数字是垃圾。未显式初始化的变量根本不会被初始化。内存已分配,但保留以前程序的旧信息。它可以包含任何东西。当你从未初始化的变量中读取时,你会得到这些垃圾。你有一个指针指向一个被破坏的对象。因此指针实际上未被初始化。
关于c++ - 表达式 : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19689639/
我遇到了这个问题: 调试断言失败! 文件: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
我是一名优秀的程序员,十分优秀!