浅拷贝指针时,默认的赋值运算符是否会产生内存泄漏?

时间:2013-10-20 21:23:00

标签: c++ pointers operator-overloading copy-constructor shallow-copy

我是这个网站的新手,也是编程世界的新手。所以,请耐心等待我:)

我读到了关于三的规则,并且我理解了复制构造函数和赋值运算符的工作原理。 所以我理解,C ++提供的默认值提供了对象的浅拷贝(或成员)。

我的问题是......如果类有一个成员指针(指向动态分配的内存),默认的赋值运算符,只会将指针中保存的地址从原始对象复制到对象的指针是被分配到。但这不会造成内存泄漏吗? 例如,followind代码:

class GCharacter //Game Character
        {
            private:
                std::string name;
                int capacity;   //the capacity of our tool array
                int used;       //the nr of elements that we've actually used in that tool array
                std::string* toolHolder; //string pointer that will be able to reference our ToolArray;

            public:
                static const int DEFAULT_CAPACITY = 5;
            //Constructor 
                GCharacter(std::string n = "John", int cap = DEFAULT_CAPACITY) 
                :name(n), capacity(cap), used(0), toolHolder(new string[cap])
                {
                }
        }

    int main()
    {         GCharacter gc1("BoB", 5); 
              GCharacter gc2("Terry", 5); 
              gc2 = gc1;
              GCharacter gc3 = gc1;

              return 0;
    }

因此,在此代码中,当创建gc1时,gc1.toolHolder保存一些5个字符串的动态分配内存的地址。让我们说,地址125.在此之后,创建gc2并动态为5个字符串分配内存,让我们说gc2.toolHolder保存地址135。

下一行代码调用默认赋值运算符,并提供gc1到gc2的每个成员的浅拷贝。这意味着现在指针gc2.toolHolder也保存地址125,我们不再能够访问地址135处的内存。因此,在这种情况下,默认赋值运算符会产生内存泄漏? ......或者我理解错了什么?

另外,另一个问题是,在默认的复制构造函数的情况下,因为它只在尚不存在的对象上调用,这意味着gc3.toolHolder将无法分配新的内存,让我们说,地址145?它只会收到存储在gc1.toolHolder中的地址?

试图更具体......我问的是,如果它与上面的情况相同,除了我们只有两个指针gc3.toolHolder和gc1.toolHolder,引用相同的地址125,没有gc3.toolHolder动态分配5个字符串的新内存。

长话短说,当我们实例化一个具有指向动态分配内存的指针成员变量的类时,默认赋值运算符会导致内存泄漏吗?并且默认的复制构造函数共享指向相同分配内存的指针?

感谢您的时间!

1 个答案:

答案 0 :(得分:2)

你有内存泄漏是缺少一个析构函数,它释放了构造函数中用new分配的内存,你需要:

~GCharacter() { delete[] toolHolder; }

如果添加此项,您将看到第二个问题:默认生成的copy-ctor和赋值只是复制/分配指针,因此当您有副本且原件和副本都超出范围时,它们将两者尝试删除内存。这个双重免费当然是更大的问题而不是内存泄漏,因为它很可能会破坏内存。

也就是说,您想要添加自己的copy-ctor和赋值运算符并正确实现它。在这种情况下,它意味着为副本的toolHolder分配内存。通常,请阅读Rule of Five,了解何时为您的班级实施哪组方法。