[英]Expression _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error
[英]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
類中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.