禁止拷贝构造,禁止bug( 三 )

发现运行的直接崩溃了~
就我们获取下core文件 , 然后看下堆栈信息:
root@iZuf67on1pthsuih96udyfZ:~/GDB/20201014# gdb a.out core (gdb) bt#00x00007ffff74aa428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54#10x00007ffff74ac02a in __GI_abort () at abort.c:89#20x00007ffff74ec7ea in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7ffff7605ed8 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175#30x00007ffff74f537a in malloc_printerr (ar_ptr=, ptr=, str=0x7ffff7605fa0 "double free or corruption (fasttop)", action=3) at malloc.c:5006#4_int_free (av=, p=, have_lock=0) at malloc.c:3867#50x00007ffff74f953c in __GI___libc_free (mem=) at malloc.c:2968#60x0000000000400caa in CTest::~CTest (this=0x7fffffffe310, __in_chrg=) at CopyConstruct.cpp:13#70x0000000000400b7a in main () at CopyConstruct.cpp:23从堆栈信息大致可以得出 , 我们程序出现异常的是在23行 , 并且在析构的时候发生了异常;
所以得出结论:
不是所有的默认拷贝构造函数都是安全的 , 在我们不需要拷贝构造函数的时候 , 我们可以把默认拷贝构造函数禁止使用 , 这样就不会出现因为默认拷贝构造函数导致难以寻找的BUG!!!
四、如何禁止拷贝构造函数禁止拷贝构造构造函数有两种方式 , 一般我们使用第一种 , 是最简单的 , 也是C++11的新特性~

  • 使用delete关键字 我们可以直接使用delete关键字进行禁止默认拷贝构造函数 public: Epoll( const Epoll --tt-darkmode-color: #A626A4;">delete;
  • 使用NonCopyable 基类 class NonCopyable {protected: NonCopyable(const NonCopyable --tt-darkmode-color: #A626A4;">delete; NonCopyable --tt-darkmode-color: #A626A4;">operator=(const NonCopyable --tt-darkmode-color: #A626A4;">delete; NonCopyable() = default; ~NonCopyable() = default;}; 我们可以使用: class A : public NonCopyable {};
使用以上两种方式 , 我们可以禁止默认拷贝函数 , 如果需要拷贝构造函数 , 我们可以自己进行编写程序;
禁止默认拷贝构造 , 禁止BUG!
往期精彩汇总GDB 多线程之旅
肝!动态规划
C++使用锁注意事项
呕心沥血的递归
muduo源码剖析学习总结
【禁止拷贝构造,禁止bug】windows程序崩溃调试终极武器
禁止拷贝构造,禁止bug文章插图