河南网站建设哪里有,安徽建站优化哪里有,品牌vi设计一般多少钱,现在从深圳回来需要隔离吗?创建并初始化C对象
当我们创建一个C对象时#xff0c;它需要占用一些内存#xff0c;即使我们写一个完全为空的类#xff0c;类中没有成员#xff0c;什么也没有#xff0c;它至少也要占用一个字节的内存。但是我们类中有很多成员#xff0c;它们需要存储在某地方#…创建并初始化C对象
当我们创建一个C对象时它需要占用一些内存即使我们写一个完全为空的类类中没有成员什么也没有它至少也要占用一个字节的内存。但是我们类中有很多成员它们需要存储在某地方当我们决定开始使用这个对象时我们会创建一堆变量对象有一堆变量我们需要在电脑的某个地方分配内存这样我们就可以记住这些变量设置的值。
应用程序会将内存主要分为两部分栈和堆还有其他部分的内存比如源代码的区域。
在C中我们要选择对象要放在哪里对象是在栈上还是在堆上创建它们有不同的功能差异。
栈栈对象有一个自动的生存期他们的生存期实际上是由它声明的地方的作用域决定的只要变量超出作用域也就是说内存被释放了,因为当作用域结束的时候栈会弹出作用域里面的东西栈上的任何东西会被释放。
堆一旦在堆中分配一个对象实际上你已经在堆上创建了一个对象它会一直待在那里直到你做出决定确定不需要它想要释放这个对象那怎末处理这段内存都行。
代码案例
在栈上创建
在什么时候在栈上创建对象
几乎所有的时候如果你能像这样在栈上创建对象那就像这样创建对象因为这是C中最快的方法也是可以管控的方法去初始化对象
某些情况下不能这么做的原因?
1、如果将实例化对象放到main函数的生存期外
void Function(){int a 2;Entity entity;}
一旦到达函数结尾的花括号这个entity会从内存中被销毁 当我们在main函数中调用Function时就为这个函数创建了一个栈结构它包含了我们声明的所有局部变量其中包括基本类型也包括我们的类和对象,当函数结束时栈帧会被销毁即栈上所有的内存所有创建的变量都消失了
如果想让括号{}内的实例化对象在作用域之外依然存在就不能分配到栈上需要使用堆分配。
2、如果entity的规模太大可能有太多的entity,可能没有足够的空间在栈上分配因为栈通常非常小通常是1M/2M
# include iostream
# include string
using namespace std;class Entity
{
private:string m_Name; //只有一个成员是一个字符串
public:Entity() : m_Name(Unknown) {}Entity(const string name) : m_Name(name) {}const string GetName() const { return m_Name; }
};int main()
{// 1、在栈上创建Entity entity; // 实际上调用了默认构造函数Entity() : m_Name(Unknown)cout entity.GetName() endl;Entity entity1(chen);// 等价于 Entity entity1 Entity(chen)cout entity1.GetName() endl;/*在什么时候在栈上创建对象几乎所有的时候如果你能像这样在栈上创建对象那就像这样创建对象因为这是C中最快的方法也是可以管控的方法去初始化对象某些情况下不能这么做的原因?1、如果将实例化对象放到main函数的生存期外void Function(){int a 2;Entity entity;}一旦到达这个花括号这个entity会从内存中被销毁当我们调用Function时就为这个函数创建了一个栈结构它包含了我们声明的所有局部变量其中包括基本类型也包括我们的类和对象,当函数结束时栈帧会被销毁即栈上所有的内存所有创建的变量都消失了Entity* e;{Entity entity2(cherno);e entity2;cout entity2.GetName() endl;} 一旦出了{}作用域就到达了栈端entity2对象就已经不存在了如果想让括号{}内的实例化对象在作用域之外依然存在就不能分配到栈上需要使用堆分配cin.get();return 0;
}
在堆上创建
在堆上创建首先要做的就是在改变类型将Entity改成Entity*,通过new关键字这里最大的区别不是那个类型变成了指针而是new关键字new关键字是关键。
Entity* entity new Entity(cherno);当我们调用new Entity时会在栈上分配内存调用构造函数这个new Entity实际上会返回一个Entity*,它会返回entity在堆上被分配的内存地址。
使用new关键字必须调用delete释放内存
delete 变量名delete entity;
性能问题在堆上分配要比栈花费更长的时间而且在堆上分配的话您必须手动释放被分配的内存
# include iostream
# include string
using namespace std;class Entity
{
private:string m_Name; //只有一个成员是一个字符串
public:Entity() : m_Name(Unknown) {}Entity(const string name) : m_Name(name) {}const string GetName() const { return m_Name; }
};int main()
{// 2、在堆上创建/*在堆上创建首先要做的就是在改变类型将Entity改成Entity*,通过new关键字这里最大的区别不是那个类型变成了指针而是new关键字new关键字是关键当我们调用new Entity时会在栈上分配内存调用构造函数这个new Entity实际上会返回一个Entity*,它会返回entity在堆上被分配的内存地址*/Entity* entity new Entity(cherno);//释放内存//delete 变量名delete entity;/*性能问题在堆上分配要比栈花费更长的时间而且在堆上分配的话您必须手动释放被分配的内存*/cin.get();return 0;
}
创建对象的两种方法如何选择
如果对象太大或者需要显示地控制对象的生存期那就是用堆创建其他情况就是用栈创建。