C++11——?jiǎng)討B(tài)內(nèi)存

智能指針

為了使管理動(dòng)態(tài)內(nèi)存更容易、更安全,新標(biāo)準(zhǔn)庫提供了兩種管理動(dòng)態(tài)對(duì)象的智能指針類型少梁。智能指針的作用類似于常規(guī)指針,但格外重要的是它會(huì)自動(dòng)刪除它指向的對(duì)象矫付。新標(biāo)準(zhǔn)庫定義了兩種智能指針凯沪,它們?cè)诠芾淼讓又羔樂矫嬗兴煌?code>shared_ptr(允許多個(gè)指針引用同一個(gè)對(duì)象)和unique_ptr(“擁有”它指向的對(duì)象)。該庫還定義了一個(gè)名為weak_ptr的伴隨類买优,它是對(duì)shared_ptr管理的對(duì)象的弱引用妨马。這三個(gè)類都在頭文件<memory>中定義。
關(guān)于頭文件<memory>的更多信息請(qǐng)參考header <memory>杀赢。

shared_ptr類

vector一樣烘跺,智能指針也是模板。因此脂崔,當(dāng)我們創(chuàng)建智能指針時(shí)滤淳,我們必須提供附加信息,即在這種情況下砌左,指針可以指向的類型脖咐。與vector一樣,我們?cè)诩饫ㄌ?hào)內(nèi)提供該類型汇歹,它遵循我們定義的智能指針類型的名稱:

Code:
    shared_ptr<string> p1;      // shared_ptr that can point at a string
    shared_ptr<list<int>> p2;   // shared_ptr that can point at a list of ints

默認(rèn)初始化智能指針為空指針文搂。我們也可以使用其他初始化摸板類的方法對(duì)其進(jìn)行初始化。
我們使用智能指針的方式類似于使用指針秤朗。解引用智能指針會(huì)返回指針指向的對(duì)象煤蹭。當(dāng)我們?cè)跅l件中使用智能指針時(shí),效果是測(cè)試指針是否為空:

Code:
    // if p1 is not null, check whether it's the empty string
    if (p1 && p1->empty())
        *p1 = "hi";  // if so, dereference p1 to assign a new value to that string

下表中列出了shared_ptrunique_ptr共有的操作:

操作 功能
shared_ptr<T> sp
unique_ptr<T> up
生成一個(gè)可以指向T類型對(duì)象的空指針取视。
p 用p作為條件硝皂,如果p指向一個(gè)對(duì)象則返回true。
*p 解引用p來獲得p指向的對(duì)象
p->mem 等效于(*p).mem作谭。
p.get() 返回p中的指針稽物。請(qǐng)謹(jǐn)慎使用;當(dāng)智能指針要?jiǎng)h除它時(shí)折欠,返回的指針指向的對(duì)象將消失贝或,這樣返回的指針就是一個(gè)空指針吼过。
swap(p, q)
p.swp(q)
交換p和q中的指針。

下表中列出了shared_ptr獨(dú)有的操作:

操作 功能
make_shared<T> (args) 返回指向類型為T的動(dòng)態(tài)分配對(duì)象的shared_ptr咪奖。使用args初始化該對(duì)象盗忱。
shared_ptr<T> p(q) pshared_ptr對(duì)象q的副本; 增加q中的計(jì)數(shù)。q中的指針必須可轉(zhuǎn)換為T *羊赵。
p = q pqshared_ptr趟佃,它們包含可以相互轉(zhuǎn)換的指針。減少p的引用計(jì)數(shù)并增加q的計(jì)數(shù); 如果p的計(jì)數(shù)變?yōu)?昧捷,則刪除p的現(xiàn)有內(nèi)存闲昭。
p.unique() 如果p.use_count()是1則返回true,否則返回false靡挥。
p.use_count() 返回與p共享的對(duì)象數(shù)序矩;這可能是一個(gè)慢速的操作,主要用于調(diào)試目的跋破。

關(guān)于shared_ptr更多信息請(qǐng)參考header <shared_ptr>贮泞。

動(dòng)態(tài)分配對(duì)象的列表初始化

我們可以使用直接初始化的方式來初始化動(dòng)態(tài)分配的對(duì)象。我們也可以使用傳統(tǒng)構(gòu)造的構(gòu)造方式(使用括號(hào))進(jìn)行初始化幔烛。在新標(biāo)準(zhǔn)下,我們也可以使用列表初始化的方式(帶花括號(hào))進(jìn)行初始化:

Code:
    int *pi = new int(1024); // object to which pi points has value 1024
    string *ps = new string(10, '9');  // *ps is "9999999999"
    // vector with ten elements with values from 0 to 9
    vector<int> *pv = new vector<int>{0,1,2,3,4,5,6,7,8,9};

我們還可以通過使用類型名稱后跟一對(duì)空括號(hào)來初始化動(dòng)態(tài)分配的對(duì)象:

Code:
    string *ps1 = new string;    // default initialized to the empty string
    string *ps = new string();   // value initialized to the empty string
    int *pi1 = new int;          // default initialized; *pi1 is undefined
    int *pi2 = new int();        // value initialized to 0; *pi2 is 0

對(duì)于定義了自己的構(gòu)造函數(shù)的類類型(如string)囊蓝,類型名稱后面是否后跟一對(duì)空括號(hào)無關(guān)緊要饿悬;無論形式如何,對(duì)象都由默認(rèn)構(gòu)造函數(shù)進(jìn)行初始化聚霜。在內(nèi)置類型的情況下妖谴,類型名稱后面是否后跟一對(duì)空括號(hào)的差異是顯著的驮瞧;內(nèi)置類型的值初始化對(duì)象具有明確定義的值,但默認(rèn)初始化對(duì)象不具有。同樣实牡,對(duì)于那些依賴于編譯器默認(rèn)生成的構(gòu)造函數(shù)的類,類中的內(nèi)置類型的成員沒有在類體中初始化据悔,那么這些成員也將未初始化岳守。
與我們通常初始化變量的原因相同,初始化動(dòng)態(tài)分配的對(duì)象也是一個(gè)好主意凉唐。

auto和動(dòng)態(tài)分配

當(dāng)我們?cè)诶ㄌ?hào)內(nèi)提供初始化器時(shí)庸追,我們可以使用auto推導(dǎo)出我們想要從該初始化器中生成的對(duì)象的類型。但是台囱,因?yàn)榫幾g器使用初始化器的類型來推斷要分配的類型淡溯,所以我們只能在括號(hào)內(nèi)使用auto和一個(gè)初始化器:

Code:
    auto p1 = new auto(obj);    // p points to an object of the type of obj
                                // that object is initialized from obj
    auto p2 = new auto{a,b,c};  // error: must use parentheses for the initializer

p1是一個(gè)指向由obj通過auto推導(dǎo)出的類型的指針。如果objint簿训,則p1int *咱娶;如果objstring米间,則p1string *;依此類推膘侮。新分配的對(duì)象由obj的值進(jìn)行初始化屈糊。

unique_ptr類

unique_ptr“擁有”它指向的對(duì)象。與shared_ptr不同喻喳,一次只能有一個(gè)unique_ptr指向給定對(duì)象另玖。當(dāng)unique_ptr被銷毀時(shí),unique_ptr指向的對(duì)象將被銷毀表伦。下表列出了unique_ptr特有的操作谦去。

操作 功能
unique_ptr<T> u1
unique_ptr<T, D> u2
生成一個(gè)指向類型T的空unique_ptr。.u1將使用delete來釋放它的指針; u2將使用類型為D的可調(diào)用對(duì)象來釋放其指針蹦哼。
unique_ptr<T, D> u(d) 生成一個(gè)指向類型T且使用d的空unique_ptr鳄哭。d必須是類型D的對(duì)象而不是delete
u = nullptr
u.release()
刪除u指向的對(duì)象纲熏,并將u置位空妆丘。
u.reset()
u.reset(q)
u.reset(nullptr)
刪除u指向的對(duì)象。如果提供了內(nèi)置指針q局劲,則指向該對(duì)象勺拣。 否則使u為空。

shared_ptr不同鱼填,沒有與make_shared相類似的庫函數(shù)返回unique_ptr药有。相反,當(dāng)我們定義unique_ptr時(shí)苹丸,我們將它綁定到new返回的指針愤惰,與shared_ptr一樣,我們必須使用直接初始化形式對(duì)其進(jìn)行初始化:

Code:
    unique_ptr<double> p1;            // unique_ptr that can point at a double
    unique_ptr<int> p2(new int(42));  // p2 points to int with value 42

因?yàn)?code>unique_ptr擁有它指向的對(duì)象赘理,所以unique_ptr不支持普通拷貝或賦值:

Code:
    unique_ptr<string> p1(new string("Stegosaurus"));
    unique_ptr<string> p2(p1);    // error: no copy for unique_ptr
    unique_ptr<string> p3;
    p3 = p2;    // error: no assign for unique_ptr

雖然我們無法拷貝或?qū)?code>unique_ptr進(jìn)行賦值宦言,但我們可以通過調(diào)用releasereset將所有權(quán)從一個(gè)(nonconstunique_ptr轉(zhuǎn)移到另一個(gè)(nonconstunique_ptr

Code:
    // transfers ownership from p1 (which points to the string Stegosaurus) to p2
    unique_ptr<string> p2(p1.release());   // release makes p1 null
    unique_ptr<string> p3(new string("Trex"));
    // transfers ownership from p3 to p2
    p2.reset(p3.release());   // reset deletes the memory to which p2 had pointed

release成員函數(shù)返回當(dāng)前存儲(chǔ)在unique_ptr中的指針,并使unique_ptrnull商模。因此奠旺,p2由存儲(chǔ)在p1中的指針值初始化,p1變?yōu)榭铡?br> reset成員接收一個(gè)可選指針施流,并重新定位unique_ptr以指向給定指針凉倚。如果unique_ptr不為null,則刪除unique_ptr指向的對(duì)象嫂沉。因此稽寒,對(duì)p2進(jìn)行的reset調(diào)用釋放了從“Stegosaurus”初始化的字符串所使用的內(nèi)存,將p3的指針傳遞給p2趟章,并使p3為空杏糙。
調(diào)用release會(huì)破壞unique_ptr與其管理的對(duì)象之間的連接慎王。通常由release返回的指針用于初始化或分配另一個(gè)智能指針。在這種情況下宏侍,管理內(nèi)存的責(zé)任只是從一個(gè)智能指針轉(zhuǎn)移到另一個(gè)智能指針赖淤。但是,如果我們不使用另一個(gè)智能指針來保存從release返回的指針谅河,我們的程序?qū)⒇?fù)責(zé)釋放該資源:

Code:
    p2.release();   // WRONG: p2 won't free the memory and we've lost the pointer
    auto p = p2.release();   // ok, but we must remember to delete(p)

關(guān)于unique_str更多信息請(qǐng)參考header <unique_str>咱旱。

weak_ptr類

weak_ptr是一個(gè)智能指針,它不控制它指向的對(duì)象的生命周期绷耍。相反吐限,weak_ptr指向由shared_ptr管理的對(duì)象。將weak_ptr綁定到shared_ptr不會(huì)更改該shared_ptr的引用計(jì)數(shù)褂始。一旦指向該對(duì)象的最后一個(gè)shared_ptr消失诸典,該對(duì)象本身將被刪除。即使有指向它的weak_ptr崎苗,該對(duì)象也將被刪除狐粱。因此名稱為weak_ptr,它強(qiáng)調(diào)了weak_ptr“弱”共享其對(duì)象的想法胆数。
下表列出了weak_ptr的相關(guān)操作:

操作 功能
weak_ptr<T> w 生成一個(gè)指向類型T對(duì)象的空weak_ptr肌蜻。
weak_ptr<T> w(sp) weak_ptr指向與shared_ptr對(duì)象sp相同的對(duì)象。類型T必須可以轉(zhuǎn)換為sp指向的類型必尼。
w = p p可以是shared_ptrweak_ptr蒋搜。賦值后wp共享所有權(quán)。
w.reset() 使w為空胰伍。
w.use_count() 返回與w共享所有權(quán)的shared_ptr數(shù)。
w.expired() 如果w.use_count()為0酸休,則返回true骂租;否則返回false。
w.lock() 如果w.expired為true斑司,則返回一個(gè)空shared_ptr渗饮;否則將返回一個(gè)指向w指向的對(duì)象的shared_ptr

當(dāng)我們創(chuàng)建一個(gè)weak_ptr時(shí)宿刮,我們用shared_ptr初始化它:

Code:
    auto p = make_shared<int>(42);
    weak_ptr<int> wp(p);    // wp weakly shares with p; use count in p is unchanged

這里wpp都指向同一個(gè)對(duì)象互站。由于共享較弱,創(chuàng)建wp不會(huì)改變p的引用計(jì)數(shù)僵缺;wp點(diǎn)指向的對(duì)象可能會(huì)被刪除胡桃。
因?yàn)閷?duì)象可能不再存在,所以我們不能使用weak_ptr直接訪問其對(duì)象磕潮。要訪問該對(duì)象翠胰,我們必須調(diào)用lock容贝。lock函數(shù)檢查weak_ptr指向的仍然存在的對(duì)象。如果存在之景,lock會(huì)將shared_ptr返回給共享對(duì)象斤富。與任何其他shared_ptr一樣,我們保證shared_ptr指向的底層對(duì)象至少在shared_ptr存在的情況下仍然存在锻狗。例如:

Code:
    if (shared_ptr<int> np = wp.lock()) { // true if np is not null
        // inside the if, np shares its object with p
    }

這里满力,我們只在調(diào)用lock成功時(shí)才進(jìn)入if的主體。在if中轻纪,使用np訪問該對(duì)象是安全的油额。
關(guān)于weak_str更多信息請(qǐng)參考header <weak_str>

for范圍聲明不適用動(dòng)態(tài)分配的數(shù)組

\color{red}{我們所謂的動(dòng)態(tài)數(shù)組不具有數(shù)組類型}\(array type)桐磁!所以不能對(duì)其使用for范圍聲明悔耘!

動(dòng)態(tài)數(shù)組的列表初始化

新標(biāo)準(zhǔn)下,我們可以使用列表初始化器來初始化一個(gè)動(dòng)態(tài)數(shù)組:

Code:
    // block of ten ints each initialized from the corresponding initializer
    int *pia3 = new int[10]{0,1,2,3,4,5,6,7,8,9};
    // block of ten strings; the first four are initialized from the given initializers
    // remaining elements are value initialized
    string *psa3 = new string[10]{"a", "an", "the", string(3,'x')};

當(dāng)我們列出初始化內(nèi)置數(shù)組類型的對(duì)象時(shí)我擂,初始化器用于初始化數(shù)組中的第一個(gè)元素衬以。如果初始值設(shè)定項(xiàng)的個(gè)數(shù)少于元素個(gè)數(shù),則其余元素是值初始化的校摩。如果初始值設(shè)定項(xiàng)多于給定的大小看峻,那么new表達(dá)式將失敗,并且不會(huì)分配任何內(nèi)存衙吩。在這種情況下互妓,new會(huì)拋出bad_array_new_length類型的異常。與bad_alloc一樣坤塞,此類型在new頭中定義冯勉。關(guān)于頭文件new更多的信息可參考header <new>
雖然我們可以使用空括號(hào)來值初始化數(shù)組的元素摹芙,但是我們不能在括號(hào)內(nèi)提供元素初始值設(shè)定項(xiàng)灼狰。事實(shí)上,我們不能在括號(hào)內(nèi)提供初始值浮禾,這意味著我們不能使用auto來申請(qǐng)分配數(shù)組交胚。

動(dòng)態(tài)分配空數(shù)組是合法的

我們可以使用任意表達(dá)式來確定要分配的對(duì)象數(shù)量:

Code:
    size_t n = get_size(); // get_size returns the number of elements needed
    int* p = new int[n];  // allocate an array to hold the elements
    for (int* q = p; q != p + n; ++q)
        /* process the array*/ ;

一個(gè)有趣的問題出現(xiàn)了:如果get_size返回0會(huì)發(fā)生什么?答案是我們的代碼正常工作盈电。即使我們不能創(chuàng)建大小為0的數(shù)組變量蝴簇,使用n等于0調(diào)用new [n]仍然是合法的:

Code:
    char arr[0];            // error: cannot define a zero-length array
    char *cp = new char[0]; // ok: but cp can't be dereferenced

當(dāng)我們使用new來分配一個(gè)大小為零的數(shù)組時(shí),new返回一個(gè)有效的非零指針匆帚。該指針與new返回的任何其他指針不同熬词。此指針用作零元素?cái)?shù)組的非結(jié)束指針(off-the-end pointer)。我們可以通過一個(gè)非結(jié)束迭代器(off-the-end iterator)來使用這個(gè)指針吸重〉磁欤可以像在上述代碼中的for循環(huán)那樣比較指針均践。我們可以在這樣的指針上加零(或從中減去零),也可以減去其自身摩幔,得到零彤委。 這種指針不能被解引用。畢竟或衡,它指向的數(shù)組中沒有元素焦影。
在上述代碼中,如果get_size返回0封断,則n也為0斯辰。對(duì)new的調(diào)用將分配一個(gè)大小為零的數(shù)組。for中的判定條件將失斊绿邸(p等于q + n彬呻,因?yàn)?code>n為0)。因此柄瑰,不執(zhí)行for循環(huán)體闸氮。

allocator::construct可以使用任何構(gòu)造函數(shù)

allocator分配的內(nèi)存是未構(gòu)造的。我們通過在該內(nèi)存中構(gòu)造對(duì)象來使用此內(nèi)存教沾。在新標(biāo)準(zhǔn)庫中蒲跨,construct成員接收一個(gè)指針和零個(gè)或多個(gè)附加參數(shù),它在給定位置構(gòu)造一個(gè)元素授翻,附加參數(shù)用于初始化正在構(gòu)造的對(duì)象或悲。與make_shared的參數(shù)一樣,這些附加參數(shù)必須是正在構(gòu)造的類型的對(duì)象的有效初始值設(shè)定項(xiàng)堪唐。特別是巡语,如果對(duì)象是類類型,則這些參數(shù)必須與該類的構(gòu)造函數(shù)匹配:

Code:
    auto q = p;   // q will point to one past the last constructed element
    alloc.construct(q++);           // *q is the empty string
    alloc.construct(q++, 10, 'c');  // *q is cccccccccc
    alloc.construct(q++, "hi");     // *q is hi!

在早期版本的標(biāo)準(zhǔn)庫中淮菠,construct只接收兩個(gè)參數(shù):構(gòu)造對(duì)象的指針和元素類型的值男公。因此,我們只能將一個(gè)元素復(fù)制到未構(gòu)造的空間中兜材,我們不能對(duì)元素類型使用任何其他構(gòu)造函數(shù)理澎。
使用尚未構(gòu)造對(duì)象的原始內(nèi)存是錯(cuò)誤的:

Code:
    cout << *p << endl;  // ok: uses the string output operator
    cout << *q << endl;  // disaster: q points to unconstructed memory!

注:我們必須construct對(duì)象以便使用allocate返回的內(nèi)存逞力。以其他方式使用未構(gòu)造的內(nèi)存是未定義的曙寡。
當(dāng)我們完成對(duì)象的使用時(shí),我們必須銷毀我們構(gòu)造的元素寇荧,我們通過在每個(gè)構(gòu)造的元素上調(diào)用destroy來實(shí)現(xiàn)举庶。destroy函數(shù)接受一個(gè)指針并在指向的對(duì)象上運(yùn)行析構(gòu)函數(shù):

Code:
    while (q != p)
        alloc.destroy(--q);    // free the strings we actually allocated

在循環(huán)開始時(shí),q指向最后一個(gè)構(gòu)造元素的后一位置揩抡。我們?cè)谡{(diào)用destroy之前遞減q户侥。因此镀琉,在第一次調(diào)用調(diào)用destroy時(shí),q指向最后構(gòu)造的元素蕊唐。我們?cè)谧詈笠淮蔚衐estroy第一個(gè)元素屋摔,之后q將等于p并且循環(huán)結(jié)束。
一旦元素被destroy替梨,我們可以重用內(nèi)存來保存其他字符串或?qū)?nèi)存返回給系統(tǒng)钓试。我們通過調(diào)用deallocate來釋放內(nèi)存:

    alloc.deallocate(p, n);

我們傳遞給deallocate的指針不能為null;它必須指向由allocate分配的內(nèi)存副瀑。而且弓熏,傳遞給deallocatesize參數(shù)必須與調(diào)用allocate中使用的大小相同才能獲得指針?biāo)赶虻膬?nèi)存。
關(guān)于allocator::construct的更多信息可參考std::allocator::construct糠睡。

參考文獻(xiàn)

[1] Lippman S B , Josée Lajoie, Moo B E . C++ Primer (5th Edition)[J]. 2013.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挽鞠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子狈孔,更是在濱河造成了極大的恐慌信认,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件除抛,死亡現(xiàn)場(chǎng)離奇詭異狮杨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)到忽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門橄教,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喘漏,你說我怎么就攤上這事护蝶。” “怎么了翩迈?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵持灰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我负饲,道長(zhǎng)堤魁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任返十,我火速辦了婚禮妥泉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洞坑。我一直安慰自己盲链,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刽沾,像睡著了一般本慕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侧漓,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天锅尘,我揣著相機(jī)與錄音,去河邊找鬼布蔗。 笑死鉴象,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的何鸡。 我是一名探鬼主播纺弊,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼骡男!你這毒婦竟也來了淆游?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤隔盛,失蹤者是張志新(化名)和其女友劉穎犹菱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吮炕,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腊脱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了龙亲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陕凹。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鳄炉,靈堂內(nèi)的尸體忽然破棺而出杜耙,到底是詐尸還是另有隱情,我是刑警寧澤拂盯,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布佑女,位于F島的核電站,受9級(jí)特大地震影響谈竿,放射性物質(zhì)發(fā)生泄漏团驱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一空凸、第九天 我趴在偏房一處隱蔽的房頂上張望嚎花。 院中可真熱鬧,春花似錦劫恒、人聲如沸贩幻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丛楚。三九已至,卻和暖如春憔辫,著一層夾襖步出監(jiān)牢的瞬間趣些,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工贰您, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坏平,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓锦亦,卻偏偏與公主長(zhǎng)得像舶替,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杠园,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 12.1 智能指針 智能指針行為類似普通指針顾瞪,但它負(fù)責(zé)自動(dòng)釋放所知的對(duì)象。 #include <memory> s...
    龍遁流閱讀 353評(píng)論 0 1
  • 除了自動(dòng)和static對(duì)象外抛蚁,C++還支持動(dòng)態(tài)分配對(duì)象陈醒。動(dòng)態(tài)分配的對(duì)象的生存期與它們?cè)谀睦飫?chuàng)建是無關(guān)的,只有當(dāng)顯式...
    夢(mèng)中睡覺的巴子閱讀 510評(píng)論 0 0
  • C#瞧甩、Java钉跷、python和go等語言中都有垃圾自動(dòng)回收機(jī)制,在對(duì)象失去引用的時(shí)候自動(dòng)回收肚逸,而且基本上沒有指針的...
    StormZhu閱讀 3,710評(píng)論 1 15
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,506評(píng)論 1 51
  • 我好像踩在時(shí)間的輪軸上 晃晃悠悠回到那個(gè)破舊的小城 不期而遇的你 亦如當(dāng)初的模樣 即使時(shí)間沖淡了我的歡喜 也曾愛你...
    滄海一聲哭閱讀 135評(píng)論 1 1