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

C++常见避坑指南

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

55510

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

    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

    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++相关基础知识总结笔记

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

    21330

    深入解析C++20中的std::span:高效、安全的数据视图

    什么是std::span?std::span是C++20引入的轻量级非拥有式容器,用于表示连续内存区域的视图。它不管理内存所有权,仅通过指针和大小描述一段数据,类似于“智能指针+长度”的组合。...>class span {T* _ptr; // 指向连续内存首地址的指针size_t _size; // 当前视图包含的元素数量};指针大小固定:在 64 位系统下,每个 span 实例仅占用 16...5.3 常量性控制std::span read_only(s); // 禁止修改6....性能对比与适用场景特性原生指针std::vectorstd::span内存所有权❌✔️❌边界检查❌✔️✔️零拷贝传递✔️❌✔️跨容器兼容性❌❌✔️推荐场景:需要统一接口处理多种容器大数据处理(避免拷贝)...与C库交互的边界安全层

    2510

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

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

    75520

    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

    const括号前括号后

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

    6710

    exception: access violation reading 0xFFFFFFFFFFFFFFFF

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

    1.7K10

    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

    【笔记】《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
    领券