中的构造函数调用分配内存
Constructor in called for allocate memory?
if 构造函数用于分配内存。
在下面的程序中,它不是那样工作的。看
#include <iostream>
using namespace std;
class Demo
{
int i;
public:
Demo()
{
cout<<"nDefault contructor called";
}
Demo(int x)
{
i = x;
cout<<"nParameter contructor called";
}
void Display()
{
cout<<endl<<"i = "<<i<<endl;
}
};
int main()
{
Demo *demo = new Demo[5]; // = {1,2,3,4,5};
int i;
cout<<endl<<endl<<"First time";
cout<<endl<<"Addresses are "<<endl;
for( i=0;i<5; i++)
{
cout<<endl<< &demo[i];
}
cout<<endl<<endl<<"first time assigning values";
for( i=0;i<5; i++)
{
demo[i]= i;
}
cout<<endl<<endl<<"nAfter first assignment";
cout<<endl<<"Addresses are "<<endl;
for( i=0;i<5; i++)
{
cout<<endl<< &demo[i];
}
cout<<endl<<endl<<"Second time assigning values";
for( i=0;i<5; i++)
{
demo[i]= i+5;
}
cout<<endl<<endl<<" After Second assignment ";
cout<<endl<<"Addresses are "<<endl;
for( i=0;i<5; i++)
{
cout<<endl<< &demo[i];
}
for( i=0;i<5; i++)
{
demo[i].Display();
}
return 0;
}
输出:
调用的默认构造器调用的默认构造器调用的默认构造器调用的默认构造器调用的默认构造器第一次地址是0x82810080x828100c0x82810100x82810140x8281018首次分配值调用的参数构造器调用的参数构造器调用的参数构造器调用的参数构造器调用的参数构造器第一次分配后地址是0x82810080x828100c0x82810100x82810140x8281018第二次赋值调用的参数构造器调用的参数构造器调用的参数构造器调用的参数构造器调用的参数构造器 第二次分配后地址是0x82810080x828100c0x82810100x82810140x8281018i = 5i = 6i = 7i = 8i = 9
这里构造函数被调用三次,内存地址相同,这意味着它没有分配新的内存并使用相同的地址。为什么?
为什么多次调用构造函数?
当你这样做时:
demo[i]= i;
i
用于使用采用 int 的构造函数构造临时对象。 然后将此临时分配给demo[i]
。 赋值不会导致demo[i]
被重建为具有不同地址的新对象(对象无法重建,并且永远无法更改其地址(,它只会导致从临时成员到demo[i]
成员的成员赋值(除非您提供执行不同操作的赋值运算符, 你没有(。
认为构造函数为对象分配内存是一个根本性的误解。调用构造函数时,您已经在堆栈或堆上分配了内存。构造函数仅准备此内存以供以后使用。
但是,构造函数通常负责为对象使用的资源分配更多的内存,即
class Container
{
public:
Container()
: ptr_(new int[5])
{}
// ...
private:
int* ptr_;
}
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?