什么是內(nèi)存泄漏梧兼?C++中如何檢測(cè)和解決?

大家好智听,我是 V 哥羽杰,內(nèi)存泄露在編程中是常見(jiàn)的一種問(wèn)題渡紫,一但程序發(fā)生內(nèi)存泄露問(wèn)題,將導(dǎo)致程序崩潰無(wú)法運(yùn)行考赛。新的一年開(kāi)始惕澎,很多小伙伴也在準(zhǔn)備金三銀四的跳槽,那在面試時(shí)欲虚,面試官多數(shù)情況下也會(huì)問(wèn)到這個(gè)問(wèn)題集灌,那咱們要怎么不在這個(gè)問(wèn)題上被秒,理解內(nèi)存泄露的細(xì)節(jié)至關(guān)重要复哆,以及哪些情況下更容易出現(xiàn)欣喧,還有怎么解決,下面的內(nèi)容 V 哥跟兄弟們一起來(lái)探討這個(gè)話題梯找。

內(nèi)存泄漏的定義

內(nèi)存泄漏是指程序在運(yùn)行過(guò)程中唆阿,由于疏忽或錯(cuò)誤導(dǎo)致已分配的內(nèi)存空間無(wú)法被正確釋放,使得這部分內(nèi)存一直被占用而無(wú)法被操作系統(tǒng)回收再利用的現(xiàn)象锈锤。在 C++ 等編程語(yǔ)言中驯鳖,如果使用 newmalloc 等動(dòng)態(tài)內(nèi)存分配操作,但忘記使用 deletefree 來(lái)釋放內(nèi)存久免,就可能會(huì)導(dǎo)致內(nèi)存泄漏浅辙。

內(nèi)存泄漏的危害

  • 隨著程序運(yùn)行時(shí)間的增長(zhǎng),可用內(nèi)存會(huì)逐漸減少阎姥,可能導(dǎo)致系統(tǒng)性能下降记舆,程序響應(yīng)速度變慢。
  • 最終可能會(huì)耗盡系統(tǒng)的內(nèi)存資源呼巴,使程序崩潰或?qū)е抡麄€(gè)系統(tǒng)出現(xiàn)故障泽腮。

檢測(cè)內(nèi)存泄漏的方法

  1. 手動(dòng)檢查代碼
    • 仔細(xì)審查代碼中使用 newnew[]衣赶、malloc 等動(dòng)態(tài)內(nèi)存分配的部分诊赊,確保在不再使用內(nèi)存時(shí),有相應(yīng)的 delete府瞄、delete[]free 操作碧磅。
    • 注意程序中的異常處理,確保在異常發(fā)生時(shí)摘能,分配的內(nèi)存也能被正確釋放续崖。
    • 對(duì)于復(fù)雜的程序,這種方法可能比較困難团搞,因?yàn)閮?nèi)存泄漏可能是由多種因素引起的严望。
  2. 使用工具
    • Valgrind
      • 這是一個(gè)強(qiáng)大的開(kāi)源工具,主要用于 Linux 平臺(tái)逻恐,可檢測(cè) C像吻、C++ 程序中的內(nèi)存泄漏等問(wèn)題峻黍。
      • 例如,在命令行中使用 valgrind --leak-check=full./your_program 運(yùn)行程序拨匆,它會(huì)生成詳細(xì)的內(nèi)存使用報(bào)告姆涩,指出哪些內(nèi)存沒(méi)有被正確釋放。
    • AddressSanitizer
      • 這是一個(gè)編譯器工具惭每,集成在 GCC 和 Clang 等編譯器中骨饿,可用于檢測(cè)多種內(nèi)存錯(cuò)誤,包括內(nèi)存泄漏台腥。
      • 可以在編譯時(shí)添加 -fsanitize=address 選項(xiàng)宏赘,如 g++ -fsanitize=address -g your_program.cpp -o your_program。運(yùn)行程序時(shí)黎侈,會(huì)輸出有關(guān)內(nèi)存錯(cuò)誤的信息察署。
    • Visual Studio 調(diào)試器
      • 在 Windows 平臺(tái)上,Visual Studio 提供了內(nèi)存診斷工具峻汉。
      • 在調(diào)試程序時(shí)贴汪,可使用“診斷工具”窗口查看內(nèi)存使用情況,它可以檢測(cè)內(nèi)存泄漏休吠,并提供詳細(xì)的信息扳埂。

解決內(nèi)存泄漏的方法

  1. 正確使用內(nèi)存管理操作符
    • 在 C++ 中,確保使用 newdelete 成對(duì)出現(xiàn)瘤礁,使用 new[]delete[] 成對(duì)出現(xiàn)聂喇。
    • 示例:
#include <iostream>

int main() {
    int* ptr = new int;  // 分配內(nèi)存
    // 使用 ptr 指針
    delete ptr;  // 釋放內(nèi)存
    return 0;
}
  • 對(duì)于 C,使用 mallocfree 時(shí)蔚携,也應(yīng)確保它們的正確使用:
#include <stdlib.h>
#include <stdio.h>

int main() {
    int* ptr = (int*)malloc(sizeof(int));  // 分配內(nèi)存
    if (ptr == NULL) {  // 檢查分配是否成功
        perror("malloc failed");
        return 1;
    }
    // 使用 ptr 指針
    free(ptr);  // 釋放內(nèi)存
    return 0;
}
  1. 使用智能指針
  • 在 C++ 中,使用智能指針(如 std::unique_ptr克饶、std::shared_ptr酝蜒、std::weak_ptr)可以自動(dòng)管理內(nèi)存,避免手動(dòng)釋放內(nèi)存的麻煩和可能的遺漏矾湃。

  • 示例:

#include <iostream>
#include <memory>

int main() {
    std::unique_ptr<int> ptr = std::make_unique<int>(42);  // 使用 unique_ptr 自動(dòng)管理內(nèi)存
    // 不需要手動(dòng) delete
    return 0;
}
  • std::unique_ptr 會(huì)在其析構(gòu)函數(shù)中自動(dòng)釋放所指向的內(nèi)存亡脑,無(wú)需顯式調(diào)用 delete
  1. 使用 RAII(Resource Acquisition Is Initialization)原則
    • 將資源的獲取和釋放封裝在類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)中邀跃,利用對(duì)象的生命周期來(lái)管理資源霉咨。
    • 示例:
#include <iostream>

class Resource {
private:
    int* data;
public:
    Resource() {
        data = new int[100];  // 在構(gòu)造函數(shù)中分配資源
    }
    ~Resource() {
        delete[] data;  // 在析構(gòu)函數(shù)中釋放資源
    }
};

int main() {
    Resource r;  // 當(dāng) r 離開(kāi)作用域時(shí),析構(gòu)函數(shù)會(huì)自動(dòng)調(diào)用拍屑,釋放資源
    return 0;
}
  1. 內(nèi)存池技術(shù)
    • 對(duì)于頻繁的內(nèi)存分配和釋放操作途戒,可以使用內(nèi)存池來(lái)提高性能和避免內(nèi)存碎片。
    • 內(nèi)存池在程序啟動(dòng)時(shí)分配一塊較大的內(nèi)存僵驰,需要內(nèi)存時(shí)從池中獲取喷斋,釋放時(shí)將內(nèi)存歸還到池中唁毒,避免了頻繁調(diào)用系統(tǒng)的內(nèi)存分配和釋放函數(shù)。
  1. 避免循環(huán)引用
    • 在使用智能指針時(shí)星爪,要注意避免循環(huán)引用浆西,特別是使用 std::shared_ptr 時(shí)。
    • 示例:
#include <iostream>
#include <memory>

class A;
class B;

class A {
public:
    std::shared_ptr<B> b_ptr;
    ~A() {
        std::cout << "A's destructor called" << std::endl;
    }
};

class B {
public:
    std::shared_ptr<A> a_ptr;
    ~B() {
        std::cout << "B's destructor called" << std::endl;
    }
};

int main() {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();
    a->b_ptr = b;
    b->a_ptr = a;  // 循環(huán)引用顽腾,會(huì)導(dǎo)致內(nèi)存泄漏
    return 0;
}
  • 可以使用 std::weak_ptr 來(lái)打破循環(huán)引用:
#include <iostream>
#include <memory>

class A;
class B;

class A {
public:
    std::shared_ptr<B> b_ptr;
    ~A() {
        std::cout << "A's destructor called" << std::endl;
    }
};

class B {
public:
    std::weak_ptr<A> a_ptr;  // 使用 weak_ptr 避免循環(huán)引用
    ~B() {
        std::cout << "B's destructor called" << std::endl;
    }
};

int main() {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();
    a->b_ptr = b;
    b->a_ptr = a;
    return 0;
}

在這個(gè)修改后的例子中近零,B 類(lèi)中的 a_ptr 被修改為 std::weak_ptr,避免了循環(huán)引用抄肖,使得 AB 的對(duì)象在不再被引用時(shí)可以正確地被銷(xiāo)毀久信。

通過(guò)上述方法,可以有效地檢測(cè)和解決內(nèi)存泄漏問(wèn)題憎瘸,確保程序的健壯性和性能入篮。

有哪些常見(jiàn)的情況會(huì)導(dǎo)致內(nèi)存泄漏?

以下是一些常見(jiàn)的會(huì)導(dǎo)致內(nèi)存泄漏的情況:

1. 忘記釋放動(dòng)態(tài)分配的內(nèi)存

在使用 new幌甘、new[](C++)或 malloc潮售、callocrealloc(C)等分配內(nèi)存后锅风,忘記使用相應(yīng)的 delete酥诽、delete[](C++)或 free(C)釋放內(nèi)存。

// C++ 示例
void func() {
    int* ptr = new int;
    // 忘記使用 delete ptr;
}
// C 示例
void func() {
    int* ptr = (int*)malloc(sizeof(int));
    // 忘記使用 free(ptr);
}

在上述函數(shù)中皱埠,分配了內(nèi)存但沒(méi)有釋放肮帐,當(dāng)函數(shù)結(jié)束時(shí),該內(nèi)存仍然被占用边器,從而導(dǎo)致內(nèi)存泄漏训枢。

2. 異常導(dǎo)致內(nèi)存泄漏

當(dāng)程序中發(fā)生異常時(shí),如果在異常發(fā)生前分配了內(nèi)存但還沒(méi)有釋放忘巧,而異常處理中又沒(méi)有正確處理該內(nèi)存釋放恒界,就會(huì)導(dǎo)致內(nèi)存泄漏。

#include <iostream>
#include <stdexcept>

void func() {
    int* ptr = new int;
    try {
        // 拋出異常
        throw std::runtime_error("Something went wrong");
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        // 沒(méi)有釋放 ptr 導(dǎo)致內(nèi)存泄漏
    }
}

正確的做法是在異常處理中確保釋放內(nèi)存:

#include <iostream>
#include <stdexcept>

void func() {
    int* ptr = new int;
    try {
        // 拋出異常
        throw std::runtime_error("Something went wrong");
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
    }
    delete ptr;  // 釋放內(nèi)存
}

3. 容器中的指針沒(méi)有正確釋放

當(dāng)使用容器存儲(chǔ)指針砚嘴,并且容器被銷(xiāo)毀時(shí)十酣,如果沒(méi)有正確刪除指針?biāo)赶虻膬?nèi)存,就會(huì)導(dǎo)致內(nèi)存泄漏际长。

#include <iostream>
#include <vector>

int main() {
    std::vector<int*> vec;
    for (int i = 0; i < 10; ++i) {
        int* ptr = new int(i);
        vec.push_back(ptr);
    }
    // 容器銷(xiāo)毀時(shí)耸采,沒(méi)有釋放存儲(chǔ)的指針指向的內(nèi)存
    return 0;
}

應(yīng)該在容器銷(xiāo)毀前手動(dòng)釋放存儲(chǔ)的指針指向的內(nèi)存:

#include <iostream>
#include <vector>

int main() {
    std::vector<int*> vec;
    for (int i = 0; i < 10; ++i) {
        int* ptr = new int(i);
        vec.push_back(ptr);
    }
    for (int* ptr : vec) {
        delete ptr;
    }
    return 0;
}

4. 循環(huán)引用導(dǎo)致的內(nèi)存泄漏

在使用智能指針時(shí),如果出現(xiàn)循環(huán)引用工育,可能會(huì)導(dǎo)致內(nèi)存無(wú)法釋放虾宇。

#include <iostream>
#include <memory>

class A;
class B;

class A {
public:
    std::shared_ptr<B> b_ptr;
};

class B {
public:
    std::shared_ptr<A> a_ptr;
};

int main() {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();
    a->b_ptr = b;
    b->a_ptr = a;
    // 當(dāng) main 函數(shù)結(jié)束時(shí),a 和 b 相互引用如绸,無(wú)法釋放內(nèi)存
    return 0;
}

解決方法是使用 std::weak_ptr 打破循環(huán)引用:

#include <iostream>
#include <memory>

class A;
class B;

class A {
public:
    std::shared_ptr<B> b_ptr;
};

class B {
public:
    std::weak_ptr<A> a_ptr;
};

int main() {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();
    a->b_ptr = b;
    b->a_ptr = a;
    return 0;
}

5. 錯(cuò)誤使用全局或靜態(tài)變量

如果全局或靜態(tài)變量中存儲(chǔ)了動(dòng)態(tài)分配的指針文留,并且沒(méi)有正確釋放好唯,可能會(huì)導(dǎo)致內(nèi)存泄漏。

#include <iostream>

class MyClass {
public:
    int* data;
    MyClass() {
        data = new int[100];
    }
};

MyClass globalObj;  // 全局對(duì)象

int main() {
    // 程序結(jié)束時(shí)燥翅,沒(méi)有釋放 globalObj.data 導(dǎo)致內(nèi)存泄漏
    return 0;
}

可以在全局對(duì)象的析構(gòu)函數(shù)中釋放內(nèi)存:

#include <iostream>

class MyClass {
public:
    int* data;
    MyClass() {
        data = new int[100];
    }
    ~MyClass() {
        delete[] data;
    }
};

MyClass globalObj;  // 全局對(duì)象

int main() {
    return 0;
}

6. 未關(guān)閉文件句柄或資源

雖然不是直接的內(nèi)存泄漏骑篙,但文件句柄或其他系統(tǒng)資源的泄漏可能會(huì)間接影響內(nèi)存使用。例如森书,打開(kāi)文件或網(wǎng)絡(luò)連接后沒(méi)有關(guān)閉靶端,會(huì)導(dǎo)致資源耗盡,進(jìn)而影響內(nèi)存凛膏。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream file("example.txt");
    // 忘記使用 file.close();
    return 0;
}

正確的做法是:

#include <iostream>
#include <fstream>

int main() {
    std::ofstream file("example.txt");
    // 操作文件
    file.close();
    return 0;
}

通過(guò)避免以上常見(jiàn)情況杨名,可以顯著減少程序中內(nèi)存泄漏的可能性,提高程序的性能和穩(wěn)定性猖毫。

如何使用智能指針來(lái)避免內(nèi)存泄漏台谍?

以下是使用智能指針來(lái)避免內(nèi)存泄漏的詳細(xì)說(shuō)明:

1. std::unique_ptr

  • 特點(diǎn)
    • std::unique_ptr 是獨(dú)占所有權(quán)的智能指針,同一時(shí)間只能有一個(gè) std::unique_ptr 擁有對(duì)某個(gè)對(duì)象的所有權(quán)吁断。
    • 當(dāng) std::unique_ptr 被銷(xiāo)毀時(shí)趁蕊,它所指向的對(duì)象會(huì)自動(dòng)被刪除。
    • 不能復(fù)制 std::unique_ptr仔役,但可以移動(dòng)它掷伙。
  • 示例代碼
#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass constructor called" << std::endl;
    }
    ~MyClass() {
        std::cout << "MyClass destructor called" << std::endl;
    }
    void print() {
        std::cout << "Hello from MyClass" << std::endl;
    }
};

int main() {
    // 使用 std::make_unique 創(chuàng)建 std::unique_ptr
    std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>(); 
    ptr->print();
    // 當(dāng) ptr 離開(kāi) main 函數(shù)的作用域時(shí),它會(huì)自動(dòng)調(diào)用 MyClass 的析構(gòu)函數(shù)
    return 0;
}
  • 代碼解釋
    • std::make_unique<MyClass>() 用于創(chuàng)建一個(gè) MyClass 對(duì)象又兵,并將其存儲(chǔ)在 std::unique_ptr 中任柜。
    • ptr->print(); 調(diào)用 MyClass 對(duì)象的 print 方法,證明對(duì)象正常使用沛厨。
    • 當(dāng) ptr 超出 main 函數(shù)的范圍時(shí)宙地,MyClass 的析構(gòu)函數(shù)會(huì)自動(dòng)調(diào)用,無(wú)需手動(dòng)調(diào)用 delete逆皮。

2. std::shared_ptr

  • 特點(diǎn)
    • std::shared_ptr 允許多個(gè)智能指針共享對(duì)同一對(duì)象的所有權(quán)绸栅。
    • 它使用引用計(jì)數(shù)機(jī)制,當(dāng)最后一個(gè) std::shared_ptr 被銷(xiāo)毀時(shí)页屠,對(duì)象會(huì)被刪除。
    • 可以復(fù)制 std::shared_ptr蓖柔,并且它們都指向同一個(gè)對(duì)象辰企。
  • 示例代碼
#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass constructor called" << std::endl;
    }
    ~MyClass() {
        std::cout << "MyClass destructor called" << std::endl;
    }
    void print() {
        std::cout << "Hello from MyClass" << std::endl;
    }
};

int main() {
    // 使用 std::make_shared 創(chuàng)建 std::shared_ptr
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>(); 
    std::shared_ptr<MyClass> ptr2 = ptr1; 
    ptr1->print();
    ptr2->print();
    // 當(dāng) ptr1 和 ptr2 都超出作用域時(shí),MyClass 的析構(gòu)函數(shù)會(huì)被調(diào)用
    return 0;
}
  • 代碼解釋
    • std::make_shared<MyClass>() 創(chuàng)建一個(gè) MyClass 對(duì)象并存儲(chǔ)在 std::shared_ptr 中况鸣。
    • std::shared_ptr<MyClass> ptr2 = ptr1;ptr2 共享 ptr1 所指向?qū)ο蟮乃袡?quán)牢贸,引用計(jì)數(shù)加 1。
    • 當(dāng) ptr1ptr2 都超出作用域時(shí)镐捧,引用計(jì)數(shù)變?yōu)?0潜索,MyClass 的析構(gòu)函數(shù)會(huì)自動(dòng)調(diào)用臭增。

3. std::weak_ptr

  • 特點(diǎn)
    • std::weak_ptr 是一種弱引用,它不會(huì)增加 std::shared_ptr 的引用計(jì)數(shù)竹习。
    • 通常用于解決 std::shared_ptr 之間的循環(huán)引用問(wèn)題誊抛。
  • 示例代碼
#include <iostream>
#include <memory>

class A;
class B;

class A {
public:
    std::shared_ptr<B> b_ptr;
    ~A() {
        std::cout << "A's destructor called" << std::endl;
    }
};

class B {
public:
    std::weak_ptr<A> a_ptr;
    ~B() {
        std::cout << "B's destructor called" << std::endl;
    }
};

int main() {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();
    a->b_ptr = b;
    b->a_ptr = a;
    // 當(dāng) main 函數(shù)結(jié)束時(shí),不會(huì)因?yàn)檠h(huán)引用而導(dǎo)致內(nèi)存泄漏
    return 0;
}
  • 代碼解釋
    • std::make_shared<A>()std::make_shared<B>() 分別創(chuàng)建 AB 的對(duì)象并存儲(chǔ)在 std::shared_ptr 中整陌。
    • a->b_ptr = b;b->a_ptr = a; 會(huì)造成循環(huán)引用拗窃,如果 a_ptr 也是 std::shared_ptr,則會(huì)導(dǎo)致內(nèi)存泄漏泌辫。
    • 但使用 std::weak_ptr 不會(huì)增加引用計(jì)數(shù)随夸,當(dāng) main 函數(shù)結(jié)束時(shí),ab 的析構(gòu)函數(shù)會(huì)被正確調(diào)用震放,因?yàn)樗鼈儾粫?huì)相互保持對(duì)方的生命周期宾毒。

小結(jié)

  • 使用 std::unique_ptr 可以確保獨(dú)占資源的自動(dòng)釋放,適用于大多數(shù)不需要共享資源的情況殿遂。
  • std::shared_ptr 適用于需要共享資源的情況诈铛,但要注意避免循環(huán)引用,否則可能導(dǎo)致內(nèi)存泄漏勉躺。
  • std::weak_ptr 可用于解決 std::shared_ptr 引起的循環(huán)引用問(wèn)題癌瘾,它不會(huì)影響對(duì)象的生命周期,但可以檢查對(duì)象是否仍然存在饵溅。

通過(guò)使用這些智能指針妨退,可以避免手動(dòng)管理內(nèi)存時(shí)可能出現(xiàn)的忘記釋放內(nèi)存、異常導(dǎo)致無(wú)法釋放內(nèi)存等問(wèn)題蜕企,從而避免內(nèi)存泄漏咬荷。

最后

充分理解內(nèi)存泄露和解決問(wèn)題的方法,不僅在編碼過(guò)程中避免問(wèn)題轻掩,也能在面試中搞定面試官幸乒,最后預(yù)祝兄弟們?cè)谛碌囊荒昀铮瑵q薪多多唇牧,工作更上一層樓罕扎,關(guān)注威哥愛(ài)編程,做一名純粹的程序員丐重。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腔召,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扮惦,更是在濱河造成了極大的恐慌臀蛛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浊仆,居然都是意外死亡客峭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)抡柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舔琅,“玉大人,你說(shuō)我怎么就攤上這事沙绝〔鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵闪檬,是天一觀的道長(zhǎng)星著。 經(jīng)常有香客問(wèn)我,道長(zhǎng)粗悯,這世上最難降的妖魔是什么虚循? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮样傍,結(jié)果婚禮上横缔,老公的妹妹穿的比我還像新娘。我一直安慰自己衫哥,他們只是感情好茎刚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著撤逢,像睡著了一般膛锭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚊荣,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天初狰,我揣著相機(jī)與錄音,去河邊找鬼互例。 笑死奢入,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的媳叨。 我是一名探鬼主播腥光,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糊秆!你這毒婦竟也來(lái)了武福?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扩然,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后聋伦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體夫偶,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡界睁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兵拢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翻斟。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖说铃,靈堂內(nèi)的尸體忽然破棺而出访惜,到底是詐尸還是另有隱情,我是刑警寧澤腻扇,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布债热,位于F島的核電站,受9級(jí)特大地震影響幼苛,放射性物質(zhì)發(fā)生泄漏窒篱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一舶沿、第九天 我趴在偏房一處隱蔽的房頂上張望墙杯。 院中可真熱鬧,春花似錦括荡、人聲如沸高镐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嫉髓。三九已至,卻和暖如春召夹,著一層夾襖步出監(jiān)牢的瞬間岩喷,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工监憎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纱意,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓鲸阔,卻偏偏與公主長(zhǎng)得像偷霉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褐筛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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