gpt4 book ai didi

C++:在实例化类成员时使用 new 关键字与不使用关键字之间的区别?

转载 作者:搜寻专家 更新时间:2023-10-31 00:21:10 24 4
gpt4 key购买 nike

对于编程作业,我们得到一个模板类,其中两个成员不是指针,而是实际对象:

Foo member;

在构造函数中,我最初尝试了 member = *(new Foo());,但了解到,至少有时,它正在复制新的 Foo 对象,因此导致内存泄漏。

我终于发现了member = Foo(),然后查了一下有什么区别。我了解到 member 将分配在堆栈而不是堆上,并且一旦超出范围就会将其删除。不过,这对对象有何作用?

是不是只有删除父/类对象时才删除成员?

我还有一个关于member = *(new Foo()); 的问题。我正在初始化两个相同类型的成员变量:

// Members
Foo member1;
Foo member2;

// Constructor {
member1 = *(new Foo());
member2 = *(new Foo());
}

出于某种原因,member1 似乎没有被复制,它保留了与初始 Foo 相同的地址(即删除时没有内存泄漏)。 member2 然而,将被复制并具有不同的地址,并且内存泄漏。对此有解释吗?

最佳答案

您的分析不正确。这两个都是内存泄漏。您正在做的是分配对象的新拷贝,将值分配给成员,然后丢弃指向已分配内存的指针而不释放该内存。这两种情况都是内存泄漏。

现在,考虑以下代码:

class MemberType {
public:
MemberType() { std::cout << "Default constructor" << std::endl; }
MemberType(int) { std::cout << "Int constructor" << std::endl; }
};

class Example1 {
public:
Example1() {}
private:
MemberType member_;
};

class Example2 {
public:
Example2() : member_(5) {}
private:
MemberType member_;
};

int main(int argc, char** argv) {
Example1 example1;
Example2 example2;
return 0;
}

此代码将打印两种不同类型的构造函数。请注意,以默认方式初始化成员根本不需要任何初始化代码。因此,在默认初始化情况下,您的 new 语句(甚至没有 new 的赋值)是不必要的。使用默认构造函数以外的构造函数初始化成员时,正确的方法是使用初始化列表。 (初始化列表就是示例中“: member_(5)”所发生的情况。

请参阅C++ FAQ on constructors有关在 C++ 中构造对象的更多信息。

关于C++:在实例化类成员时使用 new 关键字与不使用关键字之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4982466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com