我一直无法理解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