• (VS报错)已在 xxxxx.exe 中执行断点指令(__debugbreak()语句或类似调用)-解决方法&&C++创建对象四种方式


     上述报错困扰了我好几天,在网上搜了一天,到最后还是没有解决问题

    试过通过项目属性->C/C+±>代码生成->启用增强指令集->选择AVX,这种方法也没用

    但问题出现在创建对象时内存分配问题上

    方法一:

     如果是这样创建对象,并且写了析构函数会报错,把析构函数删去之后程序就能正常运行了。

    方法二:

    创建对象的方式改为这样,程序也可以正常运行了

     

    复习一下创建对象的四种方式

    给定类的定义如下

    1. class Test{
    2. private:
    3. int a;
    4. public:
    5. Test();
    6. ~Test();
    7. }

     方式一:栈中分配内存,隐式调用构造函数;

    Test A;

    方式二:栈中分配内存,显式调用构造函数;

    Test test = Test();

    方式三:堆内存中分内存,使用new关键字显式调用构造函数;

    1. Test *test = new Test;
    2. delete Test;

    方式四:其他

    • 很不常用的情况:利用对象指针;但在栈中分配内存(本质和前面两种一样,不过多了一个对象指针来操作而已)
    1. // 很不常用的情况:利用对象指针;但在栈中分配内存
    2. (本质和前面两种一样,不过多了一个对象指针来操作而已)
    3. Test test1;
    4. Test *test2 = &test1;

    注意点:

    注意1【普通对象(方式1/2)与对象指针(方式3/4)区别】
    • 方式1/2/4:使用完后不需要手动释放,该类析构函数会自动执行
    • 方式3:new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。【new和delete必须配合使用
    注意2【普通对象(方式1/2)与对象指针(方式3/4)访问类中成员的区别】:
    • 创建对象以后,可以使用点号.来访问成员变量和成员函数,这和通过结构体变量来访问它的成员类似
    • 有了对象指针后,可以通过箭头->来访问对象的成员变量和成员函数,这和通过结构体指针来访问它的成员类似
    注意3【关于方式3和方式4的说明】:
    • 在栈上创建出来的对象都有一个名字,比如 test1,test2,使用指针指向它不是必须的。
    • 但是通过 new 创建出来的对象就不一样了,它在堆上分配内存,没有名字,只能得到一个指向它的指针,所以必须使用一个指针变量来接收这个指针,否则以后再也无法找到这个对象了,更没有办法使用它。
    • 也就是说,使用 new 在堆上创建出来的对象是匿名的,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变量或成员函数。
    注意4【只定义类指针

    这跟不用new申明对象有很大区别,类指针可以先行定义,但类指针只是个通用指针,在new之前并为该类对象分配任何内存空间。比如:

    Test* ptest = NULL;

    • 但使用普通方式创建的类对象,在创建之初就已经分配了内存空间。而类指针,如果未经过对象初始化,则不需要delete释放。

    参考文章链接:https://blog.csdn.net/weixin_52028906/article/details/124513418

  • 相关阅读:
    【Linux】adduser命令使用
    redis介绍和理解
    C++之通俗易懂学模版
    计算机毕业设计Java校园二手交易系统(源码+系统+mysql数据库+Lw文档)
    OpenLDAP配置web管理界面PhpLDAPAdmin服务-centos9stream
    CS配合frp上线
    Flutter: FutureBuilder 组件的使用
    算法练习-LeetCode 剑指 Offer 16. 数值的整数次方
    Paddle图神经网络训练-PGLBox代码阅读笔记
    员工档案,云进销存财务ERP批发零售超市商贸仓库出入库管理软件开发
  • 原文地址:https://blog.csdn.net/weixin_73609038/article/details/133100560