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

C++使用new来初始化指向类的指针

C++指针初始化问题 c++中的指针是一个很经典的用法,但是也是最容易出错的,比如定义了一个指针,必须对其进行初始化,不然这个指针指向的是一个未知的内存地址,后续对其操作的时候,会报错。...下面就总结一下c++指针初始化的一些方法,以及我自己遇到的一些问题以及心得体会。...c++指针初始化的一般方法 1.将一个已经在内存中存在变量的地址传递给定义的指针 这个指针就指向这个变量的内存地址(相同的数据类型),完成初始化。...delete释放其实只是释放了申请的这块内存空间,但是指针并没有没撤销,指针还是指向这块地址,但是不可用(靠人品吃饭的有可能可以用),是非法的。...3.把指针设置为NULL或者0 这样做一般只是为了没有具体初始化的时候做的,这样避免了野指针,后面可以使用if(指针==NULL)来判断,然后再进行操作。

53720

Modern c++快速浅析

因为这是一个拷贝指针的操作,因此保留原指针的不可更改指向性并没有太大的意义 auto 大多数情况下auto推断出来的结果和模板类型推导的结果是一样的,不同点在于对大括号初始物的处理 值与指针等推导 const...int arr[pFunc(100)]; 捕获生命周期 C++中其实并没有闭包的概念,更准确的应该将lambda划分为带捕获的lambda以及不带捕获的lambda 在C#这种具备GC机制的语言中,闭包能够延长捕获的变量的生命周期...callBack(); } 常见的解决方法是使用值捕获,或者使用捕获指向堆上的指针来自行管理对象的生命周期(或者使用智能指针,注意std::shared_ptr按引用捕获的时候,不会累加引用次数...) 但按值捕获也不一定能保证悬垂安全,例如对this指针的捕获 初始化捕获 初始化捕获是C++14中引入的新特性,解决了C++11中无法“移动捕获”的问题(可以理解为是为Lambda生成的匿名类创建并初始化类成员...([](const std::vector& _data) { /* */ }, std::move(data)); 除了“移动捕获”外,还可以利用初始化捕获来初始化Lambda表达式中所需要使用的变量

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

    每个C++开发者都应该学习和使用的C++11特性

    使用示例 int* ptr1 = nullptr; // 使用 nullptr 初始化指针 int* ptr2 = NULL; // 合法,但不推荐 int* ptr3 = 0;...Lambda表达式的基本语法形式如下: [capture list] (parameter list) -> return type { // 函数体 } 其中: capture list:捕获列表...可以按值捕获、按引用捕获,也可以使用&表示按引用捕获、=表示按值捕获。 parameter list:参数列表,与普通函数的参数列表类似。...{}:函数体,与普通函数的函数体类似。 以下是一些示例: Lambda表达式不捕获任何外部变量,且不带参数和返回类型: [] { std::cout Lambda!"...类型特征可以帮助我们在编译时获取和操作类型的属性信息,例如判断某个类型是否是指针类型、是否是整数类型、是否是可调用类型等。

    7810

    两万字总结《C++ Primer》要点

    (2)void* 指针 3.理解复合类型的声明 (1)指向指针的指针 ** 表示指向指针的指针 *** 表示指向指针的指针的指针 (2)指向指针的引用 不能定义指向引用的指针。...// 捕获列表只用于局部非static变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字 // lambda必须使用尾置返回来指定返回类型 (3)lambda捕获和返回 两种...:值捕获、引用捕获 ::: warnning 当以引用方式捕获一个变量时,必须保证在lambda执行时变量是存在的。...显式捕获的变量必须使用与隐式捕获不同的方式。 lambda捕获列表 P352 可变lambda: 若希望改变一个被捕获的变量的值,必须在参数列表首加上关键字mutable。...(2)模板是标准库的基础。 生成特定类或者函数的过程称为实例化。 (3)术语 类模板:模板定义,可从它实例化出特定的类。

    2.1K30

    两万字总结《C++ Primer》要点

    = 所有容器都支持相等(不等运算符) ,>= 关系运算符(无序关联容器不支持) 获取迭代器 c.begin(), c.end() 返回指向c的首元素和尾元素之后位置的迭代器 c.cbengin...// 捕获列表只用于局部非static变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字 // lambda必须使用尾置返回来指定返回类型 (3)lambda捕获和返回 两种...:值捕获、引用捕获 ::: warnning 当以引用方式捕获一个变量时,必须保证在lambda执行时变量是存在的。...显式捕获的变量必须使用与隐式捕获不同的方式。 lambda捕获列表 P352 可变lambda: 若希望改变一个被捕获的变量的值,必须在参数列表首加上关键字mutable。...(2)模板是标准库的基础。 生成特定类或者函数的过程称为实例化。 (3)术语 类模板:模板定义,可从它实例化出特定的类。

    1.8K20

    C++11 在析构函数中执行lambda表达式(std::function)捕获this指针的陷阱

    将上图箭头位置的lambda表达式的捕获列表改为[=],[&],都试过了,问题依旧:gcc下正常,vs2015下异常。...所以前面不论将捕获列表改为[&]还是[=],还是别的什么尝试都无济于事。...因为问题的原因不是lambda表达捕获的this指针不对,而是在基类的析构函数中,lambda表达式所捕获的this指针所指向的子类对象部分的数据已经无效,不可引用了。...,如下示例,改为将f参数加入lambda表达捕获列表,也就是以传值方式把f参数提供给lambda表达。...因为这时子类的类成员变量已经被析构了,但是子类中的指针类型、基本数据类型变量因为不存在析构的问题所以还是可以用的。

    1.7K10

    C++系列笔记(十一)

    lambda表达式的通用语法 lambda 表达式总是以方括号打头,并可接受多个状态变量,为此可在捕获列表([…])中指定这些状态变量,并用逗号分隔: [ StateVar1, StateVar2] (...) mutable {//code here;} 这样,便可在lambda表达式中修改捕获列表([])中指定的变量,但离开lambda表达式后,这些修改将无效。...实例化: vector vecBool(10, true); 即它最初包含10个布尔元素,且每个元素都被初始化为 1 (即true) 理解智能指针   智能指针类重载了解除引用运算符(*')...和成员选择运算符(->),让程序员可以像使用常规指针那样使用它们....首次调用非const函数时,COW指针通常为该非const函数操作的对象创建一个副本,而其他指针实例仍共享源对象。实现const和非const版本的运算符*'和->,是实现COW指针功能的关键。

    1.3K20

    智能指针探究

    *p 是一个 CSmartPtr 类型的对象。 // 在这里,new int 是一个表达式,它使用 new 运算符动态分配内存来存储一个 int 类型的对象,并返回一个指向该对象的指针。...,是会报错的,因为这会造成一个浅拷贝的问题(等以后再详细解释 那么为了解决浅拷贝的问题,我们用不带引用计数的智能指针和带引用计数的智能指针来解决 不带引用计数的智能指针 不带引用计数的:是只能一个指针管理资源...new int[100] 这段代码中的 unique_ptr 使用了两个模板参数。...删除器是一个函数对象,用于在智能指针销毁时释放其所指向的资源 在这段代码中,删除器是一个 lambda 表达式。lambda 表达式是一种匿名函数,它可以捕获上下文中的变量并在其函数体中使用。...这个 lambda 表达式接受一个 int 指针作为参数,并在其函数体中使用 delete[] 运算符来释放该指针所指向的数组 当 ptr1 被销毁时,它会调用这个 lambda 表达式来释放其所指向的数组

    9210

    【笔记】《C++Primer》—— 第二部分:C++标准库

    谓词是一个可调用的表达式,标准库中的谓词分接受一个参数的一元谓词和接受两个参数的二元谓词 lambda有时被叫做匿名函数,是C++四种可调用对象之一(函数,函数指针,lambda,重载了调用运算符的类)...函数体 } lambda特别的成分是捕获列表,在捕获列表中可以写入一些lambda所在函数的局部变量,然后用逗号分隔 lambda有值捕获,引用捕获,隐式捕获三种类型,其中两种隐式捕获不能简单混用,详见...make_shared函数,它使用参数args初始化类型为T的对象并返回指向这个对象的智能指针,当我们想要用new的时候可以用这个函数来替代 由于智能指针内有引用计数,所以可以让多个智能指针指向同个对象共享数据...函数来转移它的所有权 我们同样可以像shared_ptr那样自定义指针的删除器,但是我们必须类似指定关联容器的比较器一样在模板尖括号中指出删除器的类型 弱指针的是一种不会影响对象生存期的指针,一般用来引用和标识...,特点就是对对象的weak_ptr指向不会增加shared_ptr的引用计数 弱指针必须用shared_ptr来赋值或初始化,且使用时必须使用lock函数的返回值来解引用 用new和方括号可以申请一大块连续内存用于初始化一个动态数组

    61730

    C++20新特性个人总结

    2.2  修改const限定的成员指针  2.3  允许lambda表达值按值捕获this  2.4  指定初始化  2.5  lambda表达式支持模板  2.6  从构造函数推导出模板参数类型 ...2.7  基于范围的for循环初始化  2.8  简化lambda的隐式捕获  2.9  ADL与不可见的模板函数  2.10  operator  2.11  基于范围的for循环初始化  2.12...  默认可构造可分配的无状态lambdas  2.13  专门的访问检查  2.14  constexpr函数的实例化  2.15  允许lambda在初始化捕获时进行包扩展  2.16  放宽结构化绑定...10 : a = 20; // 错误,a = 10不是常量表达式 };  2.2  修改const限定的成员指针  在一个右值的 .* 表达式中,如果表达式的第二个参数是指向以&修饰的成员函数的指针,那么这个程序就是不规范的...指向成员的指针类型,且引用相同的类成员,或者都是空成员指针值;  ⑦引用类型,且引用相同的对象或函数;  ⑧数组类型,对应元素满足模板参数等效;  ⑨共用体类型,或者都没有活动成员,或者都具有相同的活动成员

    1.9K50

    Lambda表达式用法超详细整理!!!

    os的唯一方法就是捕获其引用(或指向os的指针)。...注意:当以引用方式捕获一个变量的时候,必须保证lambda指向时变量是存在的 对lambda变量捕获部分重点总结: 捕获一个普通变量,如int,string或其他非指针类型,通常采用简单的值捕获方式。...也就是说,在该指针(或引用)被捕获的时刻,绑定的对象的值是我们所期望的,但在lambda执行时,该对象的值已经完全不同了。 一般来说,我们应该尽量减少捕获的数据量,来避免潜在的捕获导致的问题。...是因为由lambda产生的类中的函数调用的运算符是一个const成员函数。如果lambda被声明为可变的,则调用运算符就不是const的了。...因此,这种lambda产生的类必须为每个值捕获的变量建立对应的数据成员,同时创建构造函数,令其使用捕获捕获的变量的值来初始化数据成员。

    84530

    C++11新特性学习笔记

    unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。 离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。...没有重载 * 和 -> 但可以使用lock获得一个可用的shared_ptr对象 weak_ptr的使用更为复杂一点,它可以指向shared_ptr指针指向的对象内存,却并不拥有该内存,而使用weak_ptr...成员lock,则可返回其指向内存的一个share_ptr对象,且在所指对象内存已经无效时,返回指针空值nullptr。...除去在语法层面上的不同,lambda和仿函数有着相同的内涵——都可以捕获一些变量作为初始化状态,并接受参数进行运行。...不过C++11标准却允许lambda表达式向函数指针的转换,但提前是lambda函数没有捕获任何变量,且函数指针所示的函数原型,必须跟lambda函数函数有着相同的调用方式。

    2.1K20

    C++11新特性学习笔记

    unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。 离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。...没有重载 * 和 -> 但可以使用lock获得一个可用的shared_ptr对象 weak_ptr的使用更为复杂一点,它可以指向shared_ptr指针指向的对象内存,却并不拥有该内存,而使用weak_ptr...成员lock,则可返回其指向内存的一个share_ptr对象,且在所指对象内存已经无效时,返回指针空值nullptr。...除去在语法层面上的不同,lambda和仿函数有着相同的内涵——都可以捕获一些变量作为初始化状态,并接受参数进行运行。...不过C++11标准却允许lambda表达式向函数指针的转换,但提前是lambda函数没有捕获任何变量,且函数指针所示的函数原型,必须跟lambda函数函数有着相同的调用方式。

    2.2K20

    std::function与std::bind使用总结

    C++中函数指针的用途非常广泛,例如回调函数,接口类的设计等,但函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std...std::function可以说是函数指针的超集,它除了可以指向全局和静态函数,还可以指向彷函数,lambda表达式,类成员函数,甚至函数签名不一致的函数,可以说几乎所有可以调用的对象都可以当做std:...lambda表达式 lambda表达式其实也就是匿名函数,而Python、Java都有了自己lambda表达式,那么作为古老的语言C++同样也不能落后,C++11也推出了自己的lambda表达式语法,如下所示...: [capture](parameters)->return-type{body} 语法分析: 方括号内是匿名函数内要捕获的外部变量,而且分为值捕获和引用捕获,下面列出了几种捕获变量的写法: = 匿名函数内所用到的外部变量都按值传递...跟std::bind一样,如果我们在iOS中使用lambda表达式,而且函数体内捕获了外部变量,我们需要注意避免出现循环引用。

    11.4K92

    C++系列笔记(十二)

    • 对于int、float等变量,务必进行初始化。 • 务必将指针初始化为NULL或有效的地址———如运算符new返回的地址。 • 使用数组时,绝不要跨越其边界。...• 如果类包含原始指针成员,务必考虑如何在复制或赋值时管理内存资源所有 权,即应考虑编写复制构造函数和赋值运算符。 • 编写管理动态数组的实用类时,务必实现移动构造函数和移动赋值运算符,以改善性能。...同样,除非要修改函数参数包含的值,否则应将其声明为const引用。 • 不要使用原始指针,而应尽可能使用合适的智能指针。 • 编写实用类时,务必花精力实现让它使用起来更容易的运算符。...• 在有选择余地的情况下,务必使用模板而不是宏。模板不但是通用的,还是类型安全的。...如果您编写的lambda表达式很长,应考虑转而使用函数对象,即实现了operator()的类,因为函数对象可重用,且只有一个地方需要维护。 • 绝不要认为运算符new肯定会成功。

    1.9K30

    lambda表达式的高阶用法

    ,对divisor的指涉可能空悬 }); //按值捕获:按值捕获一个指针以后,在 lambda创建的闭包中持有的是这个指针的副本,但你并没有办法 //阻止 lambda之外的代码去针对该指针实施...* pw->addFilter(); * * 一个含有指向 Widget指针(Widhet的this指针的副本)的筛选函数 * 该函数被添加到filters中,不过当...// • 按值的默认捕荻极易受空悬指针影响(尤其是 this) ,并会误导人们认为 // lambda 式是自洽的 2条款32:使用初始化捕获将对象移入闭包 /** * @brief * C++11...++11 的 lambda没有提供移动捕获特性,但可以通过结合 std::bind 和 lambda来模拟移动捕获 * * 2,多态函数对象:绑定对象的函数调用运算符利用了完美转发,可以接受任何型别的实参...式比起使用 std::bind 而言,可读性更好、表达力更强,可能运行 // 效率也更高 // • 仅在 C++ll std::bind 在实现移动捕荻 或是绑定到具各模板化的函 // 数调用运算符的对象的场合中

    1.4K20

    【笔记】C++2.0新特性

    Types> void Foo(const T& arg0, const Types&... args); std::tuple就是借助Variadic Templates实现的, tuple的模板参数是不断递归进行了继承从而初始化的...所有这些自动生成的函数都是public且inline的, 且无法处理指针(只对指针浅拷贝), 所以当类中有指针时要记得自己定义函数 noexcept也是新关键字, 标明了目标函数是不会抛出异常的....public: // 外部捕获的变量是在自动生成的构造函数中被使用的, 默认是传值捕获 unnamed1(int X) : x(X) {} // 自动生成的调用运算符重载是const的,...原本定义上左值右值指允许被放在赋值运算符左右的值....在这个重载函数中, 我们应该利用指针(例如pimpl设计)进行对象的处理, 根据右值的协议我们可以随意处理这个参数, 因此一般直接偷走传入对象的指针.

    91320

    第 14 章 重载运算与类型转换

    其中,捕获列表中的参数就是构造函数的参数,且是这个未命名类的数据成员 ,并且在 lambda对象创建时被初始化。而 lambda表达式中的参数与函数调用运算符的参数对应。...SizeComp(size_t n) : sz(n) {} // 构造函数形参对应捕获的变量 // 调用运算符的返回类型、形参和函数体都与 lambda一致 bool operator...因此,lambda不能改变它捕获的变量。如果 lambda被声明为可变的,则调用运算符就不是 const的了。...(), nameTable.end(), less() ); C++语言中有几种可调用的对象:函数、函数指针、lambda表达式、bind创建的对象和重载了函数调用运算符的类...// 存储函数指针 int (*fp)(int, int) = add; // 指针所指向的 add是接受两个 int的版本 binops.insert({"+", fp}); // 正确

    90260
    领券