表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 错误

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error

本文关键字:gt 错误 pHead- nBlockUse BLOCK TYPE IS VALID 表达式      更新时间:2023-10-16

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

#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. 使用构造
  3. 函数重载(而不是在构造后使用类似set函数):

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

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