簡體   English   中英

表達式:_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 ++中,我們傾向於:

  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; // 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類中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM