2010-03-02 29 views
17

Nếu tôi có khai báo như sau:Tôi có nên xóa các thành viên chuỗi của một lớp C++ không?

#include <iostream> 
#include <string> 

class DEMData 
{ 
private: 
    int bitFldPos; 
    int bytFldPos; 
    std::string byteOrder; 
    std::string desS; 
    std::string engUnit; 
    std::string oTag; 
    std::string valType; 
    int idx; 
public: 
    DEMData(); 
    DEMData(const DEMData &d); 
    void SetIndex(int idx); 
    int GetIndex() const; 
    void SetValType(const char* valType); 
    const char* GetValType() const; 
    void SetOTag(const char* oTag); 
    const char* GetOTag() const; 
    void SetEngUnit(const char* engUnit); 
    const char* GetEngUnit() const; 
    void SetDesS(const char* desS); 
    const char* GetDesS() const; 
    void SetByteOrder(const char* byteOrder); 
    const char* GetByteOrder() const; 
    void SetBytFldPos(int bytFldPos); 
    int GetBytFldPos() const; 
    void SetBitFldPos(int bitFldPos); 
    int GetBitFldPos() const; 
    friend std::ostream &operator<<(std::ostream &stream, DEMData d); 
    bool operator==(const DEMData &d) const; 
    ~DEMData(); 
}; 

gì mã nên được trong destructor? Tôi có nên "xóa" các trường std::string không?

+2

Nhận xét về kiểu: Thay vì trả về 'const char *' từ các hàm, tôi muốn trả về 'const std :: string &'. Điều này là có thể khi chuỗi trả về là một thành viên của đối tượng. Và tương tự cho đầu vào, tôi muốn 'const std :: string &' –

+2

Bạn thậm chí có bận tâm để thử điều này trước khi bạn đăng câu hỏi? Bạn không thể xóa các chuỗi đó, ngay cả khi bạn muốn. –

+1

Đôi khi bạn có thể thấy mọi người gọi 'clear()' trên các thùng chứa tiêu chuẩn trước khi chúng vượt quá phạm vi ("xóa" theo nghĩa này). Điều đó cũng không cần thiết. – UncleBens

Trả lời

24

Trình phá hủy của bạn chỉ phải hủy các thành viên mà bạn phân bổ tài nguyên. vì vậy không, bạn không "xóa" chuỗi.

Bạn xóa con trỏ bạn phân bổ với mới

destructor của bạn không nhất thiết phải có nhiều hơn

~DEMData() 
{ 
} 
+10

trong thực tế, bạn có thể rời khỏi đó destructor ra. trình biên dịch sẽ làm cho nó cho bạn – pm100

+2

Và trình biên dịch sẽ tạo ra điều đó cho bạn nếu bạn không cung cấp nó. – Torlack

6

Không, tiêu chuẩn :: thành viên chuỗi được phân bổ tự động trên ngăn xếp hoặc đống cho bạn và được làm sạch tự động. Bạn không phải làm bất cứ điều gì đặc biệt trong destructor của bạn để xử lý các chuỗi.

+1

Trên ngăn xếp? Chỉ khi cá thể 'DEMData' nằm trên ngăn xếp. –

+1

Nói đúng ra, bạn không thể nói nếu đối tượng chuỗi std :: chính là trên stack hoặc đống vì bạn không biết DEMData đang được xây dựng như thế nào. Chuỗi chứa sẽ được trên heap, trừ khi việc thực hiện std :: string sử dụng std :: string object để lưu trữ chuỗi cho các chuỗi ngắn. – Torlack

3

Bạn không cần một destructor (và cũng không một constructor sao chép, cũng không một toán tử gán quá tải). Đó là toàn bộ quan điểm của việc sử dụng một lớp như chuỗi làm mọi thứ cho bạn, thay vì đi với các chuỗi kiểu C và quản lý bộ nhớ thủ công.

Trình biên dịch tạo ra tất cả các đề cập đến cho bạn và theo mặc định trình hủy chỉ gọi các destructors của tất cả các thành viên (điều này xảy ra ngay cả sau khi người dùng xác định destructor hoàn thành). String destructor mất hơn từ đó.

+0

Tôi nghĩ rằng đây nên là câu trả lời được chấp nhận vì nó trả lời "điều" làm phiền OP: > theo mặc định destructor chỉ gọi các destructors của tất cả các thành viên (điều này xảy ra ngầm ngay cả sau khi người dùng xác định destructor hoàn thành). – Opher

5

Không, bạn không được xóa các đối tượng std::string. chúng sẽ tự động được giải phóng khi hàm hủy của chúng được gọi.

Các vấn đề liên quan