再會,
當我嘗試學習一門編程語言時,我通常發現最好看看其他人的代碼。
我現在正在嘗試學習 C ,但在理解以下函式時遇到了一些麻煩(例如):
Vehicle* MyClass::GetVehicleByID(uint id)
{
Vehicle* car = new Vehicle;
car->model = vehiclesArray[id].model;
return car;
}
int main()
{
Vehicle* car = myClass.GetVehicleID(0);
std::cout << "Car Model: " << car->model << std::endl;
}
我想我理解指標的概念。但我不明白這個物件什么時候會被銷毀。我是否必須手動洗掉主函式中的物件“car”?另外,為什么我們使用 new 關鍵字而不是只使用“Vehicle car();”?據我了解, new 關鍵字會在用物件填充它之前分配記憶體嗎?
僅僅通過問這些問題,我是否完全超出了我的深度?我在哪里或如何學習了解此代碼中發生的事情?因為似乎所有教程都只解釋了“基礎知識”,例如指標是什么以及使用它們的最基本方法。
任何幫助將非常感激。
uj5u.com熱心網友回復:
是的,如果您使用new關鍵字創建物件,則必須使用關鍵字將其洗掉delete。C 中沒有垃圾收集。所以在你的情況下,這將是:
delete car;
此外,new按照您的建議直接使用建構式創建和直接使用建構式之間的區別在于,對于 new,物件是在堆上創建的,并且它的生命周期會延長,直到它被程式員顯式洗掉。在另一種情況下,它將在堆疊上創建,并在封閉函式或塊退出時自動洗掉。
在您的情況下,您在堆上創建了一個物件并且永遠不會洗掉它。這會導致所謂的記憶體泄漏。由于您的程式很小,這不是問題,程式完成后會釋放此記憶體。但是,對于長時間運行的程式,或者經常在堆上分配的程式,可能會導致程式耗盡可用記憶體。
另請注意,您可以在函式內部創建一個物件,更改簽名以回傳物件而不是指標,然后讓函式直接回傳該物件。這會起作用,但會發生的情況是首先在堆疊上創建函式的本地物件。然后該物件將被復制到在 main 函式中創建的另一個物件中,然后第一個物件將被洗掉。這不是很有效,這就是為什么使用指向在堆上分配的物件的指標的原因。使用堆的更多原因之一是用于存盤大物件。與堆相比,堆疊較小,不應用于存盤非常大的物件。
我希望這能澄清一點,但是要很好地理解這一切需要花費大量時間和作業,在 stackoverflow 上回答是不夠的。我建議閱讀有關 C 中堆上物件和堆疊上物件之間差異的更多資訊。網上有大量的資訊。
uj5u.com熱心網友回復:
只是為了你的代碼問題。也許最好使用shared_ptr而不是指標
#include <memory>
std::shared_ptr<Vehicle> MyClass::GetVehicleByID(uint id)
{
std::shared_ptr<Vehicle> car = std::make_shared<Vehicle>();
car->model = vehiclesArray[id].model;
return car;
}
int main()
{
std::shared_ptr<Vehicle> car = myClass.GetVehicleID(0);
std::cout << "Car Model: " << car->model << std::endl;
}
該課程shared_ptr基于RAII指南。所以你可能不必洗掉它。當main()年底,解構式shared_ptr::~shared_ptr()將被呼叫,指標會洗掉。
無論如何,閱讀<C Primer> 是個好主意
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/371378.html
標籤:C 11
上一篇:關于C 多型函式的問題
