2016-01-11 37 views
1

請幫助運營商delete
演示代碼新手:C++刪除操作符。如何正確使用?

MyType getDataFromDB() 
{ 
    Driver *driver; 
    Connection *con; 
    Statement *stmt; 
    ResultSet *res; 

    /* Create a connection */ 
    driver = get_driver_instance(); 
    con = driver->connect("tcp://127.0.0.1:3306", "login", "pass"); 
    /* Connect to the MySQL test database */ 
    con->setSchema("schema"); 
    stmt = con->createStatement(); 
    MyType resultAnythngAndAnother; 

    // First query 
    res = stmt->executeQuery("SELECT anything"); 

    while (res->next()) 
    { 
     // fetch data from "SELECT anything" 
    } 

    delete res; // <----- Question #1: Should I every time call delete res before next assigning of res variable? 

    // Another query 
    res = stmt->executeQuery("SELECT another"); 

    while (res->next()) 
    { 
     // fetch data from "SELECT another" 
    } 

    delete res; // <----- Question #2: Is it enough to call delete res only once here? Since it won't be used anymore. 

    return resultAnythngAndAnother; 
} 
  • 問題1:我應該每次調用資源變量的下一個分配之前刪除資源?
  • 問題2:僅僅調用一次delete res就足夠了嗎?因爲它不會再被使用了。

謝謝。

+1

由於res被賦予了新的地址,所以如果你不在'#1'中調用'delete',你將失去對分配內存的訪問。所以是的,每次你給指針指定新的內存時,你都必須調用delete。 – xinaiz

+0

@BlackMoses代碼中的哪個位置表示res被分配了新地址?爲什麼不能'stmt-> executeQuery(「SELECT something」);'只是返回一個指向stmt擁有的內存的指針? – Amadeus

+0

爲什麼在天堂(取代任意的精神幻想)的名字是你在任何地方返回指針。您應該使用瞭解如何對自己的資源進行管理的對象。 –

回答

1

對於第一

res = stmt->executeQuery("SELECT anything"); 

while (res->next()) 
{ 
    // fetch data from "SELECT anything" 
} 

delete res; // <----- Question #1: Should I every time call delete res before next assigning of res variable? 

答案取決於什麼文件說,對功能影響res。在這種情況下,答案歸結爲stmt->executeQuery()res->next()的行爲。雖然我預計res->next()的呼叫不會影響您是否需要發佈res,但閱讀文檔是唯一可行的方法。

如果文件明確地說,你需要做delete res的時候,那麼你就應該這樣做。

如果說你需要調用一些其他功能(比如Release(res))完成時,你應該這樣做。

如果文檔沒有提到這件事,那麼最好不要做任何事情。當你不知道的時候,delete resres不是應該是delete的指針時d更可能產生不需要的效果而不做任何事情。

第二,如果(且只有)你需要delete res,只做過一次。刪除指針兩次會導致未定義的行爲。

總之:只有delete res,如果你知道它是必需的,而不是delete res不止一次。

1
  1. 是。

  2. 對於每一個新的,必須有一個刪除,否則就會有內存泄漏。完成使用任何分配後,您只需刪除一次。

另一種良好的編程習慣是做

res = nullptr; 

所以你不會有任何懸擺指針。但是,這並不需要在這個特定的一段代碼

你也應該閱讀有關智能指針,new和delete不應在現代C++根據Bjarne的Stroustrup的使用。

+1

'res'是函數的本地對象,所以懸空指針的範圍不大。 – juanchopanza

+0

謝謝,我編輯了我的答案。 –

+5

'res = nullptr;'不影響指針的其他副本。它並沒有消除晃來晃去的指針。如果你的設計考慮到懸掛指針的可能性,你需要修復設計,而不是使用帶幫助。 –

3

您應該使用std::make_unique - 避免裸指針完全除非你有,你會不會是負責釋放對象的特殊情況。

1

除非你用new分配或你正在調用該函數的文檔說,客戶端必須使用釋放的delete內存,那麼你應該一味呼籲該指針delete

你不知道指針來自哪裏。它可能是用new創建的,它可能是用malloc創建的,它可能是一個更大的內存池中的指針,你不知道。

通常情況下,文檔將聲明調用某個其他函數來釋放內存或句柄。