Tại sao con trỏ trong singleton không bị leak

Chào mọi người. Theo em biết, khi cấp phát vùng nhớ sử dụng toán tử new cho con trỏ, thì bộ nhớ cấp phát vùng nhớ heap cho con trỏ. Em muốn hỏi là tại sao sử dụng singleton sử dụng toán tử new nhưng vùng nhớ không bị leak ạ (em đã thử check bằng valgrind). Chuyện gì sẽ xảy ra sau khi vùng nhớ bị leak, hệ điều hành có lấy lại nó không, hay nó bị mất luôn ạ. Mong mọi người giải đáp.

class Singleton
{
private:
    Singleton()
    {

    }

    static Singleton* s_instance;

    std::string connection_string;

    ~Singleton()
    {

    }

public:

    static Singleton* GetInstance()
    {
        if (s_instance == NULL)
        {
            s_instance = new Singleton();
        }

        return s_instance;
    }

    void SetConnectionString(const std::string& connection_string)
    {
        this->connection_string = connection_string;
    }

    std::string GetConnectionString()
    {
        return this->connection_string;
    }

};
Singleton* Singleton::s_instance = NULL;


int main()
{

    Singleton * properties = Singleton::GetInstance();

    properties->SetConnectionString("http://127.0.0.1/");
    std::cout << properties->GetConnectionString();

    return 0;
}

@Tuong_Le Trước hết bạn phải hiểu thế nào là bị leak đã.
1 vùng nhớ bị coi là leak khi nó không được thu hồi khi không còn cần đến nó nữa, dẫn đến không thể thu hồi vùng nhớ vô ích đó, lâu dần tích tụ lại làm tràn bộ nhớ. Do đó con trỏ trong singleton của bạn nếu nó vẫn đang được dùng đúng mục đích thì rõ ràng nó không hề leak rồi.
Tất cả vùng nhớ cấp phát cho chương trình sẽ tồn tại cùng với vòng đời của chương trình hoặc ít nhất đến khi được thu hồi. Vùng nhớ bị leak cũng không ngoại lệ. Khi 1 vùng nhớ bị leak, vùng nhớ đó sẽ không thể cấp phát cho 1 biến khác nữa, lâu dần sẽ gây tràn bộ nhớ. Khi chương trình chết đi thì hđh sẽ thu hồi vùng nhớ đã cấp phát cho chương trình

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?