我正在學習 c ,遇到了一個我無法解決的問題。我已經閱讀了數十篇文章,但仍然無法找出解決方案。以下是詳細資訊:我創建了一個包含兩個成員的簡單類
uint8_t* atlas;
std::vector<int> vect;
在類的建構式中,我分配記憶體并初始化向量,如下所示:
uint8_t* atlas = new uint8_t[512 * 512]();
std::vector<int> vect{ 10, 20, 30 };
稍后在另一個函式中訪問這兩個變數時:
std::cout << vect.size() << std::endl;
if(atlas == nullptr) {
std::cout << "null atlas" << std::endl;
return;
}
向量的大小為0,圖集為nullptr。在閱讀了幾篇關于這個問題的文章后,我遇到了一些東西,比如堆、堆疊、作用域和智能指標。問題是,一旦函式或范圍結束,本地分配的變數就會丟失。我的問題是atlas和vect是該類的成員,而不是本地分配的變數,那么為什么資料會丟失?根據檔案,動態分配的記憶體保持不變,它是丟失跟蹤它的指標。
幾篇文章建議使用智能指標可以解決此問題,但我無法弄清楚如何解決。我需要的是保持動態分配的資料和向量的安全,以便我可以在另一個函式中訪問它們。
uj5u.com熱心網友回復:
如果您沒有閱讀正確的內容,則閱讀數十篇文章無濟于事。您的第二個代碼片段顯示初始化區域變數,而不是類成員。
class foo
{
public:
foo()
{
// As you have described it, these variables are LOCAL. They overload
// (and hide) the class members, by defining new variables with the same
// name.
uint8_t* atlas = new uint8_t[512 * 512]();
std::vector<int> vect{ 10, 20, 30 };
}
private:
// These will be UNINITIALIZED
uint8_t* atlas;
std::vector<int> vect;
};
上面發生的是你有兩個區域變數。手動分配的會泄漏記憶體。當建構式完成時,向量將被銷毀。在這兩種情況下,都沒有foo::atlas或foo::vect從未被初始化。
這里有兩個解決方案。一種是只初始化建構式主體中的變數,而不創建多載:
foo()
{
atlas = new uint8_t[512 * 512]();
vect.assign({ 10, 20, 30 });
}
另一種選擇是使用建構式的初始化串列:
foo()
: atlas(new uint8_t[512 * 512]())
, vect{ 10, 20, 30 }
{
}
不要忘記用解構式清理你的記憶體:
~foo()
{
delete [] atlas;
}
而且,您還必須了解三法則,因為目前復制此類的實體是危險的(崩潰的)。
更好的是,不要自己管理原始指標。使用std::vector或智能指標(即 std::unique_ptr/ std::shared_ptr)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513377.html
標籤:c 11内存泄漏
