首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++常见避坑指南

shared_ptr的线程安全问题主要有两种:1. 引用计数的加减操作是否线程安全; 2. shared_ptr修改指向时是否线程安全。...引用计数 shared_ptr中有两个指针,一个指向所管理数据的地址,另一个指向执行控制块的地址。 执行控制块包括对关联资源的引用计数以及弱引用计数等。...在前面我们提到shared_ptr支持跨线程操作,引用计数变量是存储在堆上的,那么在多线程的情况下,指向同一数据的多个shared_ptr在进行计数的++或--时是否线程安全呢?...,可以修改指针本身,但不能通过指针修改所指向的值。...而对于int *const,则是表示:一个常量指针,可以修改所指向的值,但不能修改指针本身。

55410

C++11基础学习系列一

变量可以多次声明,但只能定义一次。 Complex Type C++ 中的复合类型(Complex Type)有引用、指针、类等。 引用与指针 引用即别名,引用必须被初始化,引用不是对象。...const int count = get_count(); return 0; } c++11规定,可以通过将变量声明未constexpr,由编译器来验证变量是否是一个常量表达式 #include...对于const的引用,引用类型必须与其所引用对象的类型保持一致,当然在初始化变量时可以使用常量表达式作为初始值: #include int main() { int a...指向常量的指针和常量指针指向常量的指针说明是一个指针,该指针指向的常量的地址。常量指针说明是一个指针本身定义为常量。...const int *c = &b; c = &a; #指向整型的常量指针,指针本身是一个常量,不能通过其它路径改变该指针对象的值。

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

    什么?CC++面试过不了?因为你还没看过这个!

    const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer); 修饰引用,指向常量的引用...const 的指针与引用 指针 指向常量的指针(pointer to const) 自身是常量的指针(常量指针,const pointer) 引用 指向常量的引用(reference to const)...Var); // 参数指针为常量 void function4(const int& Var); // 引用参数在函数内为常量 // 函数返回值 const int...function5(); // 返回一个常数 const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6(...此类的对象可以有效存储指向类型的名称的指针。type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值。类型的编码规则和排列顺序是未指定的,并且可能因程序而异。

    3.7K50

    C语言与C++面试知识总结

    const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer); 修饰引用,指向常量的引用...const 的指针与引用 指针 指向常量的指针(pointer to const) 自身是常量的指针(常量指针,const pointer) 引用 指向常量的引用(reference to const)...Var); // 参数指针为常量 void function4(const int& Var); // 引用参数在函数内为常量 // 函数返回值 const int...function5(); // 返回一个常数 const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6(...此类的对象可以有效存储指向类型的名称的指针。type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值。类型的编码规则和排列顺序是未指定的,并且可能因程序而异。

    5K41

    CC++ 技术面试基础知识总结

    const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer); 修饰引用,指向常量的引用...const 的指针与引用 指针 指向常量的指针(pointer to const) 自身是常量的指针(常量指针,const pointer) 引用 指向常量的引用(reference to...Var); // 参数指针为常量 void function4(const int& Var); // 引用参数在函数内为常量 // 函数返回值 const int...function5(); // 返回一个常数 const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6(...此类的对象可以有效存储指向类型的名称的指针。 type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值。 类型的编码规则和排列顺序是未指定的,并且可能因程序而异。

    1.8K20

    c++:动态库接口函数返回stl对象的设计原则塈‘__acrt_first_block == header’异常

    解决方案 知道了原因,就可以推导出解决问题的关键在于不能让exe去析构dll返回的std::string,简单的办法就是在dll中定义一个只包含一个std::string类型成员的class A,test...; }; /* raii_dll */ 请注意为了确保dll返回的对象不会被赋值为exe的内存对象,这里get()返回的是常量引用(const &) 有了raii_dll这个模板类,我们可以重新设计一下...std::string> result = test(); // 调用operator()返回对象引用 std::cout std::endl; } 总结 通过这次跳坑填坑的经历...,针对动态的接口设计可以总结几点设计原则,以避免上述的问题,就可以传递复杂类型: 动态库设计接口时,应该避免直接返回stl类型,如果不可避免(比如本例),就封装将其成一个类返回(可以照搬本文的方法) 动态库接口函数的输入.../出参数如果是class,应尽量设计为常量引用(const &),不允许被修改。

    4.5K30

    学过 C++ 的你,不得不知的这 10 条细节!

    令函数返回一个常量值,往往可以降低因程序员错误而造成的意外。...---- 在 const 和 non-const 成员函数中避免代码重复 假设 MyString 内的 operator[] 在返回一个引用前,先执行边界校验、打印日志、校验数据完整性。...唯一需要做的是:将每个 non-local static 对象搬到自己的专属函数内(该对象在此函数内被声明为 static),这些函数返回一个引用指向它所含的对象。...为了实现「连锁赋值」,赋值操作必须返回一个 reference (引用)指向操作符的左侧实参。...即使没有加 if 自我判断,这段代码还是能够处理自我赋值,因为我们对原 B 做了一份副本、删除原 B 、然后返回引用指向新创造的那个副本。 它或许不是处理自我赋值的最高效的方法,但它行得通。

    75520

    C++相关基础知识总结笔记

    extern "C"的作用 在函数前面添加 将C++风格的函数,编译为C风格、函数重载会无效 指针常量和常量指针的区别 指针常量:指针指向的数据不能被修改,但指针本身的值可以改变。...常量指针:指针本身的值不能被改变,但指针指向的数据可以被修改。...3、dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。...) const_cast用于强制去掉const 特性,但需要特别注意的是const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用 1、该运算符用来修改类型的...2、常量指针被转化成非常量指针,并且仍然指向原来的对象; 3、常量引用被转换成非常量引用,并且仍然指向原来的对象; 4、常量对象被转换成非常量对象。

    21330

    cocos2D-x 3.5 引擎解析之–引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)

    Class Ref 为引用计数类,用来管理对象的引用计数。 这样就不会出现还有指针保持指向该对象,当使用该指针操作时,假设指向的对象被销毁就会出现程序异常。...使之成为一个可使用引用计数的对象 比如: PhysicsBody* PhysicsBody::create() { PhysicsBody* body = new (std::nothrow)...* sharedPoolManager() { return getInstance(); }//static 方法返回单例对象的指针 static PoolManager* getInstance...();//使用该函数返回一个单例对象的指针,此处会检查s_singleInstance是否为空,为空就new一个PoolManager对象 CC_DEPRECATED_ATTRIBUTE static...,设置为私有元素 std::vector _releasePoolStack;//该类管理的自己主动释放池vector }; 自己主动释放池管理着一个引用计数对象的

    36410

    熬夜整理,五万字长文总结 CC++ 知识点

    ; 修饰指针,分为指向常量的指针和指针常量; 常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改; 修饰成员函数,说明该成员函数内不能修改成员变量。...Var); // 参数指针为常指针 void function4(const int& Var); // 引用参数在函数内为常量 // 函数返回值 const int...function5(); // 返回一个常数 const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6...dynamic_cast 用于多态类型的转换 执行行运行时类型检查 只适用于指针或引用 对不明确的指针的转换将失败(返回 nullptr),但不引发异常 可以在整个类层次结构中移动指针,包括向上转换、向下转换...此类的对象可以有效存储指向类型的名称的指针。type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值。类型的编码规则和排列顺序是未指定的,并且可能因程序而异。

    2K30

    《Effective C++》读书笔记(一):让自己习惯C++(条款01~04)

    char greeting[] = "Hello"; char* p = greeting; //指针p的指向可以改变,指针p指向的内容可以改变 const char* p = greeting;...//指针p的指向可以改变,指针p指向的内容不可被改变 char * const p = greeting; //指针p的指向不可以改变,指针p指向的内容可以被改变 const char* const...p = greeting; //指针p的指向不可以改变,指针p指向的内容不可以被改变 const出现在星号的左边,代表着被指物是常量。...const出现在星号的右边,代表指针本身是常量。如果const出现在星号的两边,说明被指物和指针本身都是常量。 3.2 让函数返回常量值 函数返回一个常量值,可以避免一些意外。...幸运的是,我们可以解决这个问题,办法就是:专门为non-local static对象写一个函数,然后引用返回这个对象!这样,用户调用这个函数,从而拿到了这个对象。

    21410

    const的那些事

    5.指针与const 与指针相关的const有四种: const char * a; //指向const对象的指针或者说指向常量的指针。...小结:如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。...我们不能使用指向const对象的指针修改基础对象,然而如果该指针指向了非const对象,可用其他方式修改其所指的对象。可以修改const指针所指向的值的,但是不能通过const对象指针来进行而已!...6.函数中使用const cost修饰函数返回值 这个跟const修饰普通变量以及指针的含义基本相同: (1)const int const int func1(); 这个本身无意义,因为参数返回本身就是赋值给其他的变量...以上解决了两个面试问题: (1)如果函数需要传入一个指针,是否需要为该指针加上const,把const加在指针不同的位置有什么区别; (2)如果写的函数需要传入的参数是一个复杂类型的实例,传入值参数或者引用参数有什么区别

    64230

    【C++】Chapter 0:当你学习C++之前首先需要了解的

    变为 20 右值引用 int&& rref = 5; // 5 是右值,因此可以绑定 std::cout << rref; // 输出 5 常量引用 const int& cref = 10; //...一个变量可以有多个引用 引用一旦引用一个实体,则不可以引用其他实体(java与c++的区别) 作用: 做参数 做返回值 任何场景都可以引用传参 传值和传引用的效率比较: 以值作为参数或者返回值类型...引用过程中,权限不能放大(使用范围),但可以平移或者缩小 引用 VS 指针 特性 引用(Reference) 指针(Pointer) 是否可更改绑定 不可以,必须初始化 可以,可以更改指向的对象 是否必须初始化...是,必须在定义时初始化 否,可以为空 是否支持运算 不支持指针运算 支持指针算术运算 可否指向 nullptr 不能 可以 适用场景 更安全,更直观 更灵活,可用于数组、动态分配等 使用引用的场景...需要给变量取别名(而不是指针) 需要函数参数的传递(避免了低效率的拷贝过程) 常量引用(不需要修改) 右值引用(用于移动语义) auto关键字 能根据右边的表达式自动推导左边变量的类型,常用于很长的类型的简写

    7200

    exception: access violation reading 0xFFFFFFFFFFFFFFFF

    通过遵循这些解决方法,我们可以避免该异常的发生,从而使程序更加可靠和健壮。空指针是指不指向任何有效对象或函数的指针。...空指针的作用是表示一个无效的指针,可以用来表示指针尚未被初始化、已被释放或者指向的对象已经不存在的情况。使用空指针可以避免访问无效的内存地址,从而减少程序运行时的错误。...在C++中,可以将空指针与条件语句一起使用,用于判断指针是否为空。...例如,可以使用如下条件判断语句来检测一个指针是否为空:cppCopy codeif (ptr == nullptr) { // 指针为空的处理逻辑}在使用空指针之前,需要注意以下几点:空指针不指向任何有效对象或函数...应该在使用指针之前初始化它,或者在释放指针后将其设置为空指针,以避免使用无效指针。进行操作前最好进行有效性检查,检查指针是否为空,以防止空指针解引用带来的异常。

    1.7K10

    【笔记】《Effective C++》条款1-25

    因此const T * const Foo() const;第一个const由于左边没有对象, 作用于右边的T上, 表示函数返回的指针指向的值不能改变...., 但指向的对象依然可以改变....需要返回指针时, 不如返回智能指针, 这样能避免内存回收的难题, 并通过自定义删除器来解决跨DLL销毁问题 19 设计class犹如设计type 应该像"语言设计者设计基本类型时"一样审慎地研究class...其它情况尽量都使用传引用, 因为大多数时候copy的代价都大于指针, 且难以被编译器优化 21 必须返回对象时, 别妄想返回其reference 返回对象引用时, 一定要记住引用只是别名, 底层是指针,...然而泛用实现的std::swap函数仅仅是用temp和copy来交换两个引用对象, 除非效率可以接受否则还是应该自定义 好的swap函数的核心是借助pimpl(指针指向实现)手法, 利用交换双方的实现指针来完成交换

    1.1K30

    const括号前括号后

    ptr1 指向的常量值 const在*之后(等价于在指针和*之间不加空格):表示指针本身是常量,即指针的值(即它所指向的地址)不能被修改,但可以通过这个指针来修改它所指向的数据(如果该数据不是常量)。...这通常用于返回指向内部数据的指针或引用,以确保这些数据不会被调用者修改。...函数返回类型 当 const 用于函数返回类型时,它表示返回的对象是一个常量。这通常用于返回指向内部数据的指针或引用,以确保这些数据不会被调用者修改。...指针和引用 const 也可以与指针和引用一起使用,以指定指针或引用所指向的对象是常量。...const int& ref = someInt; // ref 是一个对常量的引用 在这些例子中,const 的位置决定了它是应用于指针本身还是指针所指向的对象。

    6710

    【C++篇】启航——初识C++(下篇)

    4.2 返回值 C++ 中的函数可以返回引用,这样可以在函数外部直接修改原始数据。这种方式在某些情况下可以提高效率,但需要谨慎使用,尤其是返回局部变量的引用是危险的。...指针:指针是一个变量,它存储一个地址,指向另一个变量的内存位置。指针在定义时不一定要初始化,可以在之后赋值。 (2).初始化 引用:在定义引用时,必须立即初始化并引用一个有效的对象。...一旦绑定到某个变量后,就无法改变引用的对象。 int a = 10; int &b = a; // 必须初始化 指针:指针在定义时不需要初始化,可以稍后赋值。指针可以随时指向不同的对象。...int a = 10; int &b = a; std::cout << b; // 直接访问 指针:需要使用解引用操作符 * 访问指针指向的对象。...类型指针( void* )的常量。

    5810

    const 使用总结

    const和指针与引用一样,指针也可以指向常量或非常量,指向常量的指针不能用于修改其所指对象的值,常量对象的地址只能存放于指向常量的指针中:const int i = 1024;int *p = &i;...// 错误,不能存放常量的地址const int *cp = &i;// OK*cp = 0;// 错误,不能给*cp赋值指向常量的指针没有规定一定要指向常量对象,允许它指向一个非常量对象,只是不能通过指针来修改所指对象的值...可以使用常量实参或者非常量实参来初始化它都可以。可以根据形参中有没有const来区分函数是否重载:class Object {// ...}...:const class A a; 这时this指针并不能指向常量对象a;因为非常量指针不能指向常量对象。...但却返回一个引用,从而允许对返回结果进行赋值,这就违背了常量的本意,造成的后果是未定义行为。

    13210
    领券