2010-11-09 27 views
8

Cấu trúc tôi đã tạo:C++ cách xóa cấu trúc?

struct VideoSample 
    { 
     const unsigned char * buffer; 
     int len; 
    }; 

    VideoSample * newVideoSample = new VideoSample; 
    newVideoSample->buffer = buf; 
    newVideoSample->len = size; 

     //... 

Làm cách nào để xóa ngay bây giờ?

+1

Ai sở hữu bộ đệm * *? Tỷ lệ cược khác không phải là bạn cần một destructor là tốt. –

Trả lời

20
delete newVideSample; 

này sẽ không giải phóng bất kỳ bộ nhớ bạn được phân bổ cho newVideoSample->buffer mặc dù - bạn phải giải phóng nó một cách rõ ràng trước khi xóa.

//Free newVideSample->buffer if it was allocated using malloc 
free((void*)(newVideSample->buffer)); 

//if it was created with new, use `delete` to free it 
delete newVideSample->buffer; 

//Now you can safely delete without leaking any memory 
delete newVideSample; 

Thông thường loại này giải phóng được viết trong destructor của lớp để nó sẽ được gọi tự động khi bạn delete đối tượng tự động tạo ra.

Cảm ơn @steve đề cập đến nó :)

+0

fives me C2664 miễn phí (newVideSample-> buffer); hàng. một cái gì đó như nó không thể chuyển đổi const unsigned char vào void * – Rella

+1

Điều này xứng đáng một -1 - để sử dụng 'miễn phí' mà không biết bộ nhớ đến từ đâu, và không đề xuất điều này được thực hiện trong destructor nếu con trỏ được thiết lập. Không downvoting, bởi vì không có câu trả lời khác thậm chí đề cập đến điều này. –

+0

Cảm ơn @Steve, đã cập nhật bài đăng. – Amarghosh

3

Bạn đang tìm kiếm cho từ khóa delete:

delete newVideoSample; 
2

Trừ khi tôi là thiếu một cái gì đó, bạn chỉ cần sử dụng delete:

delete newVideoSample; 
7
delete newVideoSample; 

Nhưng nếu newdelete là trong bối cảnh tương tự, bạn có lẽ tốt hơn bỏ qua chúng và chỉ tạo ra nó trên stack thay vì:

VideoSample newVideoSample = {buf, size}; 

Trong trường hợp đó, không cần dọn dẹp.

+1

Có theo mặc định không cần phải "mới" hoặc "xóa" đối tượng. Chỉ sử dụng nó nếu bạn thực sự biết tại sao bạn cần nó. – Nikko

2

delete newVideoSample. Trong C++ struct giống với class nhưng với các trường công khai mặc định.

3

delete newVideoSample;

Tuy nhiên, xem xét sử dụng một smart pointer rằng sẽ giải phóng bộ nhớ tự động, ví dụ:

std::auto_ptr<VideoSample> newVideoSample(new VideoSample); 
+0

Tôi sẽ xem xét đầu tiên "không có con trỏ". – Nikko

2

Sử dụng delete

VideoSample * newVideoSample = new VideoSample; 
//.. stuffs 

delete newVideoSample; 

Ngoài ra còn có một overload tức delete[]

VideoSample * newVideoSample = new VideoSample[n]; 
//.. stuffs 

delete [] newVideoSample; 

Trong C++ hiện đại, nên luôn sử dụng con trỏ thông minh. Bạn có thể muốn sử dụng boost::shared_ptr<T> từ thư viện tăng cường.

1

Để phân bổ -> VideoSample * newVideoSample = new VideoSample;

Để xóa -> xóa newVideoSample;

Nếu bạn xóa đối tượng trong cùng một ngữ cảnh, bạn chỉ cần phân bổ đối tượng đó trên ngăn xếp. Nếu bạn xóa nó bên ngoài ngữ cảnh, đừng quên chuyển một tham chiếu.

Và quan trọng nhất, đừng xóa nếu sắp thoát khỏi quá trình của bạn, đó là vô nghĩa: P

+0

"không xóa nếu bạn muốn thoát khỏi quá trình, nó là vô nghĩa" ** Không. ** Tại sao điều này ở mức +2? Ít nhất, để rõ ràng 'xóa' là tự tài liệu và lịch sự. Hơn thế nữa, nếu hệ điều hành bỏ qua để xóa đối tượng hoặc một trong các tài nguyên _its_ thì sao? Ngoài ra nó đảm bảo bạn tránh được những kết quả dương tính giả trong các bộ phân tích rò rỉ bộ nhớ, v.v. Thực sự, 'xóa' không khó, vì vậy hãy luôn làm điều đó. Nếu bạn bắt đầu giải thích sự thiếu sót trong các tình huống mà [Dr Evil fingers] "" "không nên" "" vấn đề, bạn đang yêu cầu rắc rối khi bạn quên 'xóa' trong một tình huống mà nó thực sự làm_. http://stackoverflow.com/q/677812/2757035 –

2

Nếu bạn dự định VideoSample để giải phóng thành viên buffer của nó sau đó VideoSample là một lớp mỏng manh. Nó không có cách nào để biết liệu buf đã được tạo trong heap bằng cách sử dụng new[] hoặc malloc hoặc là địa chỉ của một biến trên ngăn xếp.

2

Trong C++ một cấu trúc giống hệt như một lớp, ngoại trừ mọi thứ được công khai theo mặc định, trong đó lớp là riêng tư theo mặc định. Vì vậy, một cấu trúc có thể có một destructor và được giải phóng với xóa.

0

* * Bạn có thể tạo đối tượng của Videosample, vì vậy bạn chỉ cần sử dụng xóa ..

VideoSample * newVideoSample = new VideoSample; xóa newVideoSample; * *

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