checked_delete问题: Beyond the C++ STL: an introduction to boostdeleter::do_it

环境:

Visual studio 2017

boost库编译选项: msvc141,multi,win64,debug,shared

demo工程设置: debug, win32


问题源:

《Beyond the C++ STL: an introduction to boost》书上Part I, Library 3, checked_delete章节

如果把 deleter.h, deleter.cpp, to_be_deleted.h三个文件内容整合到一个文件里,

编译后会提示 " warning C4150: 删除指向不完整“to_be_deleted”类型的指针;没有调用析构函数"

运行后调用 deleter::do_it  时会间接调用到 ~to_be_deleted()。

调用 deleter::delete_it  时则不会间接调用到 ~to_be_deleted()。

最后调用完 ~to_be_deleted()程序结束时才报一个异常错误。

很奇怪的地方啊!看来是编译器工作方式的不同导致的吧。。。


// deleter.h
class to_be_deleted;
class deleter {
public:
	void delete_it(to_be_deleted* p);
	void do_it(to_be_deleted* p);
};

// deleter.cpp
//#include "deleter.h"
#include "boost/checked_delete.hpp"
void deleter::delete_it(to_be_deleted* p) {
	delete p;
}
void deleter::do_it(to_be_deleted* p) { 
	boost::checked_delete(p);  // typedef char type_must_be_complete[sizeof(T)]; 所有代码放入一个文件,这句居然能编译通过??
}

// to_be_deleted.h
#include <iostream>
class to_be_deleted
{
public:
	~to_be_deleted() {
		std::cout <<
			"I'd like to say important things here, please.";
	}
};

// Test application
//#include "deleter.h"
//#include "to_be_deleted.h"
int main() {
	to_be_deleted* p = new to_be_deleted;
	deleter d;
	d.delete_it(p);
	d.do_it(p);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值