c和c++這類沒有gc的語言是不是騙自己?
操作系統gc就不叫gc了?
操作系統那個叫收屍
操作系統GC…
你會把『強拆』叫『家政服務』麼?
最後電腦賣給收廢品的也叫GC
我想了一想,C++還是可以有GC的。
我就寫了個簡單的,完全照搬Garbage Collection for Python
#include &
#include &
#include &
#include "gc.hpp"
struct Counter {
static ::std::size_t count;
bool valid;
Counter()
: valid(true) {
}
Counter(Counter o) noexcept : valid(false) {
::std::swap(valid, o.valid);
}
Counter
operator=(Counter ) = delete;
Counter(Counter const ) = delete;
Counter
operator=(const Counter ) = delete;
~Counter() {
if (valid)
count++;
}
};
::std::size_t Counter::count = 0;
struct Cycle : public ::gc::Object&
Counter c;
::gc::Ptr&
};
int
main() {
{
Counter::count = 0;
{
auto p = ::gc::make&
}
assert(Counter::count == 1);
}
{
Counter::count = 0;
{
::gc::Ptr&
{
auto p2 = ::gc::make&
p1 = p2;
}
assert(Counter::count == 0);
::gc::collect();
assert(Counter::count == 0);
}
assert(Counter::count == 1);
}
{
Counter::count = 0;
{
auto p1 = ::gc::make&
auto p2 = ::gc::make&
p1-&>peer = p2;
p2-&>peer = p1;
}
assert(Counter::count == 0);
::gc::collect();
assert(Counter::count == 2);
}
}
C++已經被玩壞了,哈哈哈
微軟很多年前出過一個只用來玩耍的操作系統Midori,GC就是寫進了驅動里的,上面跑的native language是C#,還帶有go引以為豪的goroutine的等價實現(逃
C++也可以用庫自己來實現GC,但是限制通常都很大。以前我閑的蛋疼也做了一個(https://github.com/vczh/vczh_toys/blob/master/CppGarbageCollection/CppGarbageCollection/Main.cpp),但是一想到要給所有已經存在的和未來的容器類型也全部弄一遍(除非他們肯重寫),我就覺得沒什麼希望(逃操作系統並不負責gc,那個的確不叫gc
如果程序gc像操作系統那樣寫,那大一點的程序基本沒法運行了
照你這定義,手動free也算是GC吧……
所以題主你指的是swap out還是oom-killer啊?
系統內核內存泄漏算不算騙自己?
關機後內存清零就不算釋放了?當然可以有GC了,你自己去實現一個就行。C++這玩意就是「看起來封裝的很好」罷了,實際應用過程中要考慮的還是比較多的。
概念混淆了。操作系統的GC並不是在C/C++對象不再生存時進行空間釋放,所以不算作某一語言的GC。
問題是,如果你沒有delete 佔滿內存怎麼辦。。。操作系統GC僅僅是釋放掉zombie進程的內存而已 它又不知道一個進程裡面哪些內存是Garbage
推薦閱讀:
※如果沒有PGO,JIT 編譯相比AOT 編譯有哪些優勢?
※如何從粗通一門編程語言到精通一門?
※哪一種計算機語言最適合入門?是C語言嗎?可是我覺得指針難死了!?
※各位覺得主流編程語言中哪個編程語言最容易學習?
※有什麼好的 Haskell 中文書籍?