当函数返回指向类的指针时调用其复制构造函数
Is copy constructor called when a pointer to a class is returned by function?
这个问题可能很愚蠢,但是我想知道,当函数返回指向对象的指针时,是否调用了复制构造函数?此外,考虑:
A* a1 = new A();
A* a = a1.GetPointer();
A* GetPoineter()
{
.....
return new A();
}
A* a = a1.GetPointer();
调用复制构造函数?
如果我删除a
,它是否也会删除a1
所指向的地址?
不,它不调用复制构造函数,因为您返回的是对象的地址,而不是对象本身。
delete a;
只会删除GetPoineter
函数中分配的对象。a1
不受影响,因为它指向一个完全不同的对象
那么
A* a = a1.GetPointer();
调用复制构造函数吗?
。
在你的情况下,你没有返回一个对象,而只是一个对象的地址,所以它不会导致复制构造函数调用。
当你返回对象时,它取决于编译器。
现代的编译器足够聪明,可以通过使用返回值优化(RVO)和命名返回值优化(NRVO)来防止对复制构造函数的额外调用。
如果是
delete a
,它也会删除a1
指向的地址吗?
不会的。
如果您只是delete
a
,那么您的代码将导致内存泄漏,因为您仍然没有释放分配给a1
的内存。
相关文章:
- 当从函数参数中的临时值调用复制构造函数时
- 为什么调用复制构造函数而不是移动构造函数?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 编译器调用复制运算符而不是移动运算符
- push_back std::vector,则重复调用复制构造函数
- 为什么调用复制构造函数来构造空unique_ptr向量?
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 我打算调用initializer_list构造函数,如果存在,则事先调用复制构造函数:为什么?
- C++ - 从移动分配运算符调用复制分配
- 构造函数初始值设定项列表未调用复制构造函数
- 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 通过引用传递对象时是否调用复制构造函数?
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 为什么要抛出引用调用复制构造函数的异常?
- 为什么即使参数标记为"const",也会调用复制构造函数?
- Clang-Tidy:移动构造函数通过调用复制构造函数来初始化类成员
- 为什么当我添加一个不同的对象(复制构造函数中的参数)时调用复制构造函数?
- 为什么调用复制构造函数,当我只返回对象 c++ 的引用时
- 为什么在下面的代码中调用复制构造函数两次