簡體   English   中英

指向結構 C++ 中的向量的指針

[英]Pointer to vector in a struct C++

我遇到了一些崩潰,因為我在結構中使用了一個可能必須使用大約 6000 個元素的向量。 這是我的結構:

struct Students 
{
char* names;
std::vector<int> scores;
};

有沒有辦法讓我的向量不會導致我的結構導致錯誤。 這是我的調用代碼。

while(scores.hasNext())
{
    students[current_student].scores.push_back(grade);
}

我的問題:如果這是結構內向量的大小分配問題,我可以聲明一個指向向量的指針並尊重我的向量,而不是將它實際放在結構中嗎?

Grades 只是 integer。

你讓我想起了這里有人遇到過的類似問題。 由於沒有為您的代碼的 rest 提供足夠的信息,我只是在這里猜測一下。

顯然students是一個結構Students的數組。 假設它是在堆上分配的,如果您使用malloc執行此操作,它將無法正常工作,因為malloc 不會正確初始化結構中的成員 特別是,這里的scores是一個非 POD object,它需要通過調用其構造函數來正確構造。

// the member in your structure is not initialized
students = (struct Students*) malloc(10 * sizeof(Students));

// oops.. scores is not initialized
students[0].scores.push_back(100);

要解決它,您需要調用new 它將通過調用其構造函數來正確初始化成員。

// ok
students = new Students[10];

如果您在這一行中從vector的代碼中得到一些錯誤

students[current_student].scores.push_back(grade);

這並不意味着問題出在向量上。 這意味着您訪問了無效的 memory (未初始化或未分配)。 可能current_student超出了students的范圍,或者您通過調用malloc而不是new來分配students

如果您不提供更多代碼,就無法回答您的問題。

首先,您不應該將struct視為需要特殊預防措施的奇怪事物。 它們相當於 class

然后,如評論中所述,您應該添加真正的代碼,因為如果您真的這樣做:

while(scores.hasNext())
{
  students[current_student].scores.push_back(grade);
}

那么你將繼續向你的向量添加元素(如果hasNext()聽起來像它的話),直到你得到一個std::bad_alloc()

最后,不要擔心向量的大小: std::vector基本上已經是指向堆中向量的指針。 無論向量變得多么“胖”,您的結構都將保持“小”。

暫無
暫無

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

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