2015-10-23 14 views
5

Mọi người!Xóa [] tương đương với mỗi lần xóa phần tử. C++

phép nói rằng tôi đang viết lớp Array và muốn tối ưu hóa xây dựng

data = reinterpret_cast<T*>(new char[sizeof (T) * size]); 
    for (int i = 0; i < size; ++i) { 
     new(&data[i]) T(some_value); 
} 

Và bây giờ tôi đang tự hỏi làm thế nào để nhớ chính xác giải phóng:

  1. delete[] data;

  2. for (int i = 0; i < size; ++i) { data_[i].~T(); }

+0

Bạn đang cố gắng viết lại ['std :: array'] (http://en.cppreference.com/w/cpp/container/array)? – NathanOliver

+0

Điều gì sẽ xảy ra nếu mảng được phân bổ không phải là căn chỉnh đúng cho T? –

+0

@NathanOliver, tất nhiên tôi không cố gắng làm điều này :-) Đó là tất cả trí tưởng tượng tò mò của tôi. – aob

Trả lời

2

Khái niệm xóa [] data phải phù hợp với mới T [] đã tạo ra mảng trên heap, do đó T là loại * dữ liệu. Nếu không, hành vi của chương trình là không xác định (5.3.5).

Trong ví dụ của bạn, loại dữ liệu* dữ liệu không xác định. Nếu T không phải là char, hành vi không xác định.

Bạn nên không gọi xóa [] dữ liệu, ngay cả sau khi gọi hàm hủy trong vòng lặp. Sẽ tốt hơn nếu gọi xóa [] reinterpret_cast < char * > (dữ liệu) để tránh hành vi không xác định. Các máy hủy của loại T phải được gọi trước khi giải phóng bộ nhớ.

1

Bạn cần gọi hàm hủy trước trước khi delete nhập dữ liệu.

// First step 
for (int i = 0; i < size; ++i) { 
    data_[i].~T(); 
} 

// Second step 
delete [] data; 
0
// First, you must call the destructors, so that objects will be destroyed 
for (int i = 0; i < size; ++i) { 
    data_[i].~T(); 
} 

// Then, deallocate memory from the heap. 
delete[] data; 
Các vấn đề liên quan