表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 错误
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error
此错误发生在运行时,我不确定是什么原因造成的 - 代码对我来说看起来是正确的。
#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; // checks if r.d_hasProject is not itself
你可能想要
r.d_hasProjector = !r.d_hasProjector;
完整代码:链接
另外,这里有一个关于高级C++内容的必读链接,我相信这对你非常有用:http://www.parashift.com/c++-faq/
编辑:我忘记了你的问题:
除此之外,打印的文本显示的数字非常大且通常是负数。是什么原因造成的?
这些数字是垃圾。未显式初始化的变量根本不初始化。内存已分配,但保留先前程序中的旧信息。它可以包含任何东西。当你从未初始化的变量中读取时,你会得到这个垃圾。你有一个指向一个被破坏对象的指针。因此,指针实际上是未初始化的。
你的问题在这里:
void Event::set(Room r, const std::string& name) {
d_room = &r;
d_name = name;
}
&r
采用对象的地址,该对象的生存期在函数返回时结束,从而导致稍后尝试访问它时出现未定义的行为。
如果要使用指针,则需要动态分配它们:
void Event::set(Room* r, const std::string& name) {
d_room = r;
d_name = name;
}
// ...
for (int i = 0; i < noLect; ++i) {
Room* r = new Room;
r->d_noSeat = i + 1;
r->d_hasProjector != r.d_hasProjector;
lectures[i].set(r, "CSI2372");
lectures[i].print();
}
// ...
但看起来你在这里不需要指针,你应该能够拥有
Room d_room;
在Event
类中。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 链接器(MinGW的ld v2.23.2)错误,格式:-L<SOMEDIR>-l<lib1-l<l