首页
学习
活动
专区
圈层
工具
发布

【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 | 静态成员变量初始化 | 静态成员变量访问 | 静态成员变量生命周期 )

static int number; }; 3、静态成员变量初始化 静态成员变量 初始化 : 静态成员变量 是在 类使用时 , 在类的外部 进行 初始化 ; Student 类的 静态成员 成员变量...初始化有两种方式 : 声明 并 进行初始化 : 声明类内部已经定义的 静态成员变量 , 然后进行初始化 ; // 在类外部初始化静态成员变量 int Student::number = 1; 只进行初始化...= " << s.number << endl; 5、静态成员变量生命周期 静态成员变量 的 生命周期 就是 程序的声明周期 ; 静态成员变量 在 应用启动时 初始化 , 在 进程结束时销毁 ; 静态成员变量在多个对象之间共享...static int number; 声明 静态成员变量 并进行初始化的代码为 int Student::number = 1; // 在类外部声明并初始化静态成员变量 int Student:...:number = 1; 单独进行 静态成员变量 初始化 , 代码为 Student::number = 2 ; // 在函数中为 类 静态成员变量 赋值 Student::number = 2;

4.1K20

【CC++ make_shared和shared_ptr直接初始化有什么区别?】

std::make_shared 和直接使用 std::shared_ptr 初始化是 C++ 中创建共享智能指针的两种不同方式。它们之间的主要区别在于内存分配、效率、异常安全性和使用上的便利性。...内存分配: std::shared_ptr 直接初始化时,可能会涉及两次内存分配:一次用于分配被管理的对象,一次用于分配引用计数块(控制块)。...std::shared_ptr 直接初始化时,如果需要传递参数给对象的构造函数,可能需要额外的包装代码。...下面是一个使用 std::make_shared 和直接初始化 std::shared_ptr 的例子: 使用 std::make_shared: auto ptr = std::make_shared...(arg1, arg2, arg3); 直接初始化 std::shared_ptr: std::shared_ptr ptr(new MyClass(arg1, arg2

16110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一次诡异的内存泄漏

    接着,退出作用域,此时有std::make_shared创建的对象开始释放,因此其内部的成员变量r....总结 下面解释下我当时阅读这块代码最难理解的部分,下面是make_shared执行过程: •_Sp_counted_base有两个成员变量,分别为_M_use_count用于表示强引用计数和_M_weak_count...用于表示弱引用计数•__shared_count继承于_Sp_counted_base,其内部有一个变量_M_ptr指向对象指针•__shared_ptr中存在成员变量__shared_count•使用...对上述分配的内存块进行初始化(只初始化Obj大小不符,引用计数等已经初始化完成)•创建shared_ptr,因为使用的make_shared初始化,所以传入的指针为空,相应的_Sp_counted_base...中的_M_ptr也为空 下面是析构过程: •析构shared_ptr对象的同时,释放其内部成员变量_M_use_count•_M_use_count调用Release()函数,在这个函数中,如果强引用计数为

    53010

    C++ 动态内存

    静态内存: 保存局部static对象,类static数据成员和任何定义在函数之外的变量。 栈内存: 保存定义在函数内的非static对象。...当给shared_ptr赋予一个新值 2. shared_ptr被销毁,局部变量shared_ptr离开其作用域时会被销毁。 ?...除了采用make_shared创建和初始化智能指针,我们还可以用new返回的指针来初始化智能指针。 ?...我们推荐使用make_shared而不是采用new的方式,这是因为采用make_shared的方式能在分配对象的同时就讲shared_ptr与内存进行绑定,避免了无意中将同一块内存绑定到多个独立创建的shared_ptr...unique_ptr没有类似的make_shared函数,当我们定义一个unique_ptr时需要将其绑定到一个new返回的指针上,初始化unique_ptr必须采用直接初始化形式。 ?

    1.1K20

    C++避坑指南

    对于作用域为多个编译单元的静态对象,不能保证其初始化次序。如下代码中,在x.cpp和y.cpp分别定义了变量x和y,并且双方互相依赖。...//x.cppextern int y;int x = y + 1; x.cpp中使用变量y来初始化x //y.cppextern int x;int y = x + 1; y.cpp中使变量x来初始化...) { Person::~Person(); throw; }} 表面上构造函数定义为空且是inline,但编译器实际会生成如右侧的伪代码来构造基类成分和成员变量...shared_ptr sp(new Object()); auto sp = make_shared();  b、减少内存管理器调用次数。...可能产生①③②的顺序,此时如果③getData()产生异常,而new Handler对象指针还没有托管到shared_ptr中,于是内存泄漏发生。使用make_shared可以避免这个问题。

    2.1K30

    智能指针-使用、避坑和实现

    不能在STL容器中使用,因为复制将导致数据无效 一些STL算法也可能导致auto_ptr失效,比如std::sort算法 不能作为函数参数,因为这会导致复制,并且在调用后,导致原数据无效 如果作为类的成员变量...,都需要操作引用计数 内存占用上小于shared_ptr shared_ptr需要维护它指向的对象的线程安全引用计数和一个控制块,这使得它比unique_ptr更重量级 使用make_shared初始化...第一种初始化方法,有两次内存分配: new Type分配对象 为p1分配控制块(control block),控制块用于存放引用计数等信息 我们再看下make_shared源码: template_Getptr(), _Rx); return (_Ret); } 这里的_Ref_count_obj类包含成员变量: 控制块 一个内存块,用于存放智能指针管理的资源对象...从上面分析我们可以看出,第一种初始化方式(new方式)共有两次内存分配操作,而第二种初始化方式(make_shared)只有一次内存申请,所以建议使用make_shared方式进行初始化。

    1.4K10

    智能指针(一)

    内存使用 一般情况下有三种内存,静态内存用于保存局部static对象、类static数据成员以及函数外被定义的变量,这种对象或者变量在使用之前被分配,程序结束时销毁;栈内存用于保存在函数内的非static...new和delete new能在堆内创建一个匿名对象(该对象可以进行直接,值和列表初始化),然后返回指向该对象的指针。...new也可以配合auto来使用,自行推断对象的类型,但是初始化的参数只能有一个。...对于shared_ptr支持的常见操作而言,有以下几种: make_shared(args) //初始化 shared_ptrp(q) //q为智能指针,则拷贝指针;q指向new分配的对象...w对象的shared_ptr weak_ptr需要用shared_ptr进行初始化,但是不能用make_shard,比如: auto a = make_shared(0); weak_ptr<

    1K10

    变量声明和初始化 var, :=, new() 和 make()

    [golang] 变量声明和初始化 var, :=, new() 和 make() 说明 go语言中,提供了多种变量声明和初始化的方法。这里着重一一说明。并提供一个简单的指南。...当使用文字方式初始化一个变量,并且需要指明类型时,使用var变量声明方式。 避免使用new(),除非你需要一个指针变量。...// 初始化一个整数指针变量,指向的值为0 var i3 *int = new(int) fmt.Println(*i3) // 初始化一个slice指针变量 var i4 = new([10...map指针变量,指向的值为[] var i5 *map[string]int = new(map[string]int) fmt.Println(*i5) // 输出: map[] // 初始化一个...chan指针变量,指向的值为nil var i6 *chan int = new(chan int) fmt.Println(*i6) // 输出: nil make() make只用于初始化 slice

    4.5K40

    Java中类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)

    初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 3.其次,...初始化父类的普通成员变量和代码块,在执行父类的构造方法; 4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法; 类的加载顺序: 父类静态成员变量、静态块>子类静态成员变量、 静态块>...父类普通成员变量、非静态块>父类构造函数>子类 普通成员变量、非静态块>子类构造函数 静态代码块:随着类的加载而执行,而且只执行一次 非静态代码块:每创建一个对象,就执行一次非静态代码块 关于各个成员简介...: 小练习: 下面代码输出结果是 class C { C() { System.out.print("C"); } } class A { C c = new...super("B"); System.out.print("B"); } public static void main(String[] args) { new

    1.6K30

    C++:20---成员变量初始化方式

    成员变量初始化有三种方式: 在构造函数体内赋值初始化 在自定义的公有函数体中赋值初始化(一般用于成员变量的初始化) 在构造函数的成员初始化列表初始化 一、构造函数体内初始化 说明:在构造函数体内的初始化方式...,本质是是为成员变量赋值,而不是真正意义上的初始化,这点要特别注意!...,而与成员变量的定义顺序有关(下面有演示案例) 初始化列表初始化优先于构造函数内的代码执行顺序 写在构造函数的后面,随着构造函数的执行而执行 初始化顺序: 多个成员之间用逗号隔开,括号内为形参 一般只对无动态内存的成员...) 一个特殊情况:如果用一个成员变量去初始化另一个成员变量,就要注意初始化顺序了 因此,我们在初始化的时候,尽量避免用某些成员去初始化另一个成员 //下面代码中,i先被初始化,但是i是根据j初始化的,但...& m_id; public: Person(int i); }; Person::Person(int i) { id=i;//错误,const成员变量必须在成员初始化列表初始化 m_id=id;//

    2.4K30

    掌握C++中智能指针的综合指南:深入现代内存管理

    2.3.1、初始化 make_shared / reset通过构造函数、std::shared_ptr辅助函数和reset方法来初始化shared_ptr,代码如下:std::shared_ptrshared_ptr p=new int(1);shared_ptr不能通过“直接将原始这种赋值”来初始化,需要通过构造函数和辅助方法来初始化。...解决的办法是把A和B任何一个成员变量改为weak_ptr。三、unique_ptr(1)unique_ptr是一个独占型的智能指针,不能将其复制给另一个unique_ptr。...四、weak_ptrshare_ptr虽然已经很好用了,但是有一点share_ptr智能指针还是有内存泄露的情况,当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效...4.3、weak_ptr解决循环引用问题在shared_ptr提到智能指针循环引用的问题,因为智能指针的循环引用会导致内存泄漏,可以通过weak_ptr解决该问题,只要将A或B的任意一个成员变量改为weak_ptr

    1.4K01

    【规则分享】CC++成员变量未初始化

    /CodeAnalysis 国内镜像:https://git.code.tencent.com/Tencent_Open_Source/CodeAnalysis 背景介绍 ▼ 在C/C++中,成员变量未初始化可能会导致未定义的行为...当声明一个类或结构体时,其中的成员变量默认情况下不会被初始化。这意味着它们的值是未知的,可能是任意的。如果使用未初始化的成员变量,可能会导致程序出现错误或产生不可预测的结果。...通过在声明时进行初始化,可以确保成员变量在使用之前具有已知的初始值,从而避免未定义的行为。...错误示例: 检测结构体被实例化时候,没有对成员变量进行初始化赋值的情况: #include struct MyStruct { int num; float value...; char character; MyStruct() : num(0), value(0.0f), character('\0') { // 构造函数中对成员变量进行初始化赋值

    91910

    C++:08---成员变量初始化方式

    成员变量初始化有三种方式: 在构造函数体内赋值初始化 在自定义的公有函数体中赋值初始化(一般用于成员变量的初始化) 在构造函数的成员初始化列表初始化 一、构造函数体内初始化 说明:在构造函数体内的初始化方式...,本质是是为成员变量赋值,而不是真正意义上的初始化,这点要特别注意!...,而与成员变量的定义顺序有关(下面有演示案例) 初始化列表初始化优先于构造函数内的代码执行顺序 写在构造函数的后面,随着构造函数的执行而执行 初始化顺序: 多个成员之间用逗号隔开,括号内为形参 一般只对无动态内存的成员...) 一个特殊情况:如果用一个成员变量去初始化另一个成员变量,就要注意初始化顺序了 因此,我们在初始化的时候,尽量避免用某些成员去初始化另一个成员 //下面代码中,i先被初始化,但是i是根据j初始化的,但...而赋值是先初始化一个临时变量,再赋值。前者效率高

    71320
    领券