gpt4 book ai didi

c++ - 表达式 : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error

转载 作者:太空狗 更新时间:2023-10-29 19:52:48 26 4
gpt4 key购买 nike

此错误发生在运行时,我不确定是什么原因导致的 - 代码对我来说看起来是正确的。

#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++ 中,我们倾向于:

  1. 避免裸指针,更喜欢智能指针:

    class Event 
    {
    std::shared_ptr<Room> d_room;
    ...

    Event::~Event() { /* no need to delete */ }
  2. 使用构造函数重载(而不是在构造后使用类似set 的函数):

    Event(Room& r, const std::string& name):
    d_room(new Room(r)),
    d_name(name)
    {}
  3. 通过引用传递:

    void set(Room& r, const std::string& name);
  4. 避免原始数组,改用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com