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

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,c++,memory-leaks,delete-operator,C++,Memory Leaks,Delete Operator,如果发生这种情况 aClass *ptr new aClass(); ... ptr = anotherObjectPtr 指针指向的对象现在丢失在内存中,这将导致内存泄漏。应该先删除对象 我希望以上是正确的 但是我写了这个小程序,在那里我得到了一些意想不到的行为 #include <iostream> #include <string> using namespace std; class Database { private: Datab

如果发生这种情况

aClass *ptr new aClass();
...
ptr = anotherObjectPtr 
指针指向的对象现在丢失在内存中,这将导致内存泄漏。应该先删除对象

我希望以上是正确的

但是我写了这个小程序,在那里我得到了一些意想不到的行为

#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函数中,当我调用delete[]arrNames时,我认为正在发生的是与当前数组arrNames关联的内存被破坏,因此arrNames现在指向垃圾,然后arrNames被定向到内存中temp指向的另一个位置。所以,如果我没有调用delete[]arrNames,那么内存中的位置就会无效,导致内存泄漏。然而,当我注释掉这一行时,代码仍然可以正常工作。我不明白这里有什么吗

对不起,这么久了
感谢halp

内存泄漏不涉及任何无效内容。恰恰相反,使内存位置无效是一种失败,导致它在不应该使用的情况下仍继续使用。

内存泄漏不涉及任何无效内容。恰恰相反,使内存位置无效是一种失败,导致它在不应该使用的情况下仍继续使用。

从我在代码中看到的情况来看,addName似乎是要将新名称附加到动态数组中。自己做这件事可能会让人头疼,我强烈推荐一个现有的方便的STL模板,名为vector,来自header。 如果添加include并将string*arrNames更改为vector arrNames,则整个addName函数可以简化为:

void addName(string name){
    arrNames.push_back(name);
}

通过vector.size方法,您还可以确定向量的当前长度,并且不再需要您的成员容量和大小。

从我在代码中看到的情况来看,addName似乎是要将新名称附加到动态数组中。自己做这件事可能会让人头疼,我强烈推荐一个现有的方便的STL模板,名为vector,来自header。 如果添加include并将string*arrNames更改为vector arrNames,则整个addName函数可以简化为:

void addName(string name){
    arrNames.push_back(name);
}
通过vector.size方法,您还可以确定向量的当前长度,并且不再需要您的成员容量和大小

然而,当我注释掉这一行时,代码仍然可以正常工作。我不明白这里有什么吗

关于编程,需要知道的一件重要事情是,正确地做事情不仅仅是让事情表面上正常工作

通常情况下,你可以直接尝试一些事情,让事情看起来有效,但随后一些外部环境发生了变化,一些你没有明确控制或解释的事情发生了变化,事情就停止了。例如,您可能编写了一个程序,它在您的计算机上运行find,然后您尝试向某人演示它,碰巧在他们的计算机上运行它,程序崩溃。这个想法是程序员们经常开玩笑的基础:它对我有用

所以,事情似乎是可行的,但为了知道即使条件改变,事情也会奏效,你必须达到更高的标准

您已经被告知如何正确地使用delete,但这并不一定意味着如果您不这样做,事情会以一种明显的方式破裂。你需要放弃这样的想法:你可以通过尝试来确定某件事是否正确

然而,当我注释掉这一行时,代码仍然可以正常工作。我不明白这里有什么吗

关于编程,需要知道的一件重要事情是,正确地做事情不仅仅是让事情表面上正常工作

通常情况下,你可以直接尝试一些事情,让事情看起来有效,但随后一些外部环境发生了变化,一些你没有明确控制或解释的事情发生了变化,事情就停止了。例如,您可能编写了一个程序,它在您的计算机上运行find,然后您尝试向某人演示它,碰巧在他们的计算机上运行它,程序崩溃。这个想法是程序员们经常开玩笑的基础:它对我有用

所以,事情似乎是可行的,但为了知道即使条件改变,事情也会奏效,你必须达到更高的标准

您已经被告知如何正确地使用delete,但这并不一定意味着如果您不这样做,事情会以一种明显的方式破裂。你需要放弃这样一种想法,即你可以通过尝试来确定某件事是否正确。

首先,当你删除某件事时,你并不是在内存中销毁它,而是让它可以用于进一步的分配 阳离子。这有点类似于文件系统——当您删除文件时,您只是说它占用的空间现在可用于一些新数据。在调用delete之后,实际上可以检索未修改的数据,但这是未定义的行为,并且是特定于编译器/操作系统的

如果不删除名称,则会将其数据遗忘在进程的内存中,从而造成内存泄漏。但是除了这个致命的缺陷之外,再也没有什么神奇的事情发生了。

首先,当您删除某个内容时,您并不是在内存中销毁它,而是让它可以用于进一步的分配。这有点类似于文件系统——当您删除文件时,您只是说它占用的空间现在可用于一些新数据。在调用delete之后,实际上可以检索未修改的数据,但这是未定义的行为,并且是特定于编译器/操作系统的


如果不删除名称,则会将其数据遗忘在进程的内存中,从而造成内存泄漏。但是除了这个致命的缺陷之外,再也没有什么神奇的事情发生了。

当你评论出哪一行时?不删除某些内容不会使任何内容无效,它只是泄漏内存—在不应该删除的时候保持它的有效性。代码仍然可以正常工作—存在问题。您创建了一个未被检测到的内存泄漏。内存泄漏指的是已分配的内存,但程序中没有指针指向它。如果您的代码在其他方面表现正常,那么在程序中使用指针就可以了。内存泄漏的问题是,最终分配将开始失败,您将无法释放泄漏的内存来防止这种情况。因此,为了确认,我在代码中添加了delete[]arrNames行,这样做是正确的,只是有时候泄漏不会被检测到。是吗?当你评论出哪一行?不删除某些内容不会使任何内容无效,它只是泄漏内存—在不应该删除的时候保持它的有效性。代码仍然可以正常工作—存在问题。您创建了一个未被检测到的内存泄漏。内存泄漏指的是已分配的内存,但程序中没有指针指向它。如果您的代码在其他方面表现正常,那么在程序中使用指针就可以了。内存泄漏的问题是,最终分配将开始失败,您将无法释放泄漏的内存来防止这种情况。因此,为了确认,我在代码中添加了delete[]arrNames行,这样做是正确的,只是有时候泄漏不会被检测到。是这样吗?