我一直無法理解C++中的刪除和刪除[]函數。這是我目前所知:C++ - 需要幫助理解刪除功能
aClass *ptr = new aClass(); //Allocates memory on the heap for a aClass object
//Adds a pointer to that object
...
delete ptr; //ptr is still a pointer, but the object that it
//was pointing to is now destroyed. ptr is
//pointing to memory garbage at this point
ptr = anotehrOjbectPtr //ptr is now pointing to something else
在出現這種情況的話,
aClass *ptr new aClass();
...
ptr = anotherObjectPtr
該指針指着,現在失去了在內存中的對象,ADN這將導致內存泄漏。該對象應該先被刪除。
希望以上是正確的
但是我寫了這個小程序,在那裏我得到一些意外的行爲
#include <iostream>
#include <string>
using namespace std;
class Database {
private:
Database() {
arrNames = NULL;
capacity = 1;
size = 0;
}
Database(const Database &db) {}
Database &operator=(const Database &db) {}
string *arrNames;
int capacity, size;
public:
static Database &getDB() {
static Database database;
return database;
}
void addName(string name) {
if (arrNames == NULL) {
arrNames = new string[capacity];
}
if (size == capacity - 1) {
capacity *= 2;
string *temp = new string[capacity];
int i = 0;
while (i <= size) {
temp[i] = arrNames[i];
i++;
}
delete [] arrNames;
arrNames = temp;
}
arrNames[size] = name;
size++;
}
void print() {
int i = 0;
while (i <= size) {
cout << arrNames[i] << endl;
i++;
}
}
};
int main() {
Database &database = Database::getDB();
Database &db = Database::getDB();
Database &info = Database::getDB();
database.addName("Neo");
db.addName("Morpheus");
info.addName("Agent Smith");
database.print();
db.print();
info.print();
}
在addName功能,當我打電話刪除[] arrNames,什麼我認爲正在發生的事情是與當前數組arrNames關聯的內存被銷燬,所以arrNames現在指向垃圾,然後arrNames被指向指向temp指向的內存中的另一個位置。所以如果我沒有調用delete [] arrNames,那麼內存中的那個位置就會失效,導致內存泄漏。但是,當我將該行註釋掉時,代碼仍然沒有問題。我在這裏沒有理解什麼嗎?
遺憾,這對這麼久 感謝HALP
當你註釋掉哪一行?不刪除某些內容不會使任何內容失效,它只是泄漏內存 - 在不應該的時候保持有效。 –
*代碼仍然可以正常工作* - 存在問題。您創建了一個未被發現的內存泄漏。 – PaulMcKenzie
內存泄漏是指已分配的內存,但程序中沒有指針指向它。如果你的代碼在其他方面行爲恰當,那麼在你的程序中使用指針就可以正常工作。內存泄漏的問題在於,最終分配將開始失敗,您將無法釋放泄漏的內存來防止這種情況發生。 – Peter