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);
}



发布了52 篇原创文章 · 获赞 29 · 访问量 43万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章