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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章