2011-07-01 39 views
5

thể trùng lặp:
delete[] supplied a modified new-ed pointer. Undefined Behaviour?xóa [] Mảng ký tự

Hãy nói rằng tôi đã được phân bổ một số ít các nhân vật sử dụng new char[number].

Chỉ có thể xóa một vài ký tự kết thúc (giống như delete[] (charArray + 4);, được cho là sẽ phân bổ tất cả các ký tự ngoại trừ bốn ký tự đầu tiên)?

Tôi đọc mà new[] cửa hàng số một số hiện thực của các đối tượng được phân bổ trước khi các mảng của các đối tượng để delete[] biết có bao nhiêu đối tượng để de-phân bổ, vì vậy nó có thể không an toàn để làm những gì tôi đang hỏi ...

Cảm ơn.

EDIT:

là tự xóa các byte cuối không mong muốn sử dụng riêng biệt delete báo cáo một cách an toàn để làm những gì tôi đang yêu cầu?

Trả lời

1

Cách "an toàn" duy nhất để thực hiện việc này là phân bổ một mảng mới, sao chép dữ liệu và xóa dữ liệu cũ. Hoặc bạn chỉ có thể theo cách std::vector và phân biệt giữa "dung lượng" (kích thước của mảng) và "kích thước" (số lượng phần tử trong đó).

+0

Bạn có thể giải thích thêm một chút về cách 'std :: vector' không? – slartibartfast

+0

@myrkos Nó phân bổ không gian để lưu trữ các phần tử * n *, nhưng nó có thể báo cáo kích thước của nó là * <= n *. Điều này là để làm cho thay đổi kích thước hiệu quả hơn. – Maxpm

+0

@myrkos: Nó phân bổ không gian "nguyên" với ':: toán tử mới' và sau đó sử dụng vị trí 'mới' để biến không gian thô đó thành các đối tượng. Khi cần phá hủy các đối tượng (ví dụ, khi 'vectơ' nằm ngoài phạm vi hoặc các phần tử' xoá'), nó sẽ gọi trực tiếp dtor để làm như vậy. –

6

Không, bạn phải delete[] chính xác cùng một con trỏ bạn nhận được với new[].

0

Không, bạn chỉ có thể xóa toàn bộ mảng.

2

Bạn không thể xóa phân đoạn cụ thể của một mảng.

Nếu bạn chỉ hoạt động trên chuỗi C, bạn có thể đặt ký tự thành \0 và mọi chức năng hoạt động trên chuỗi sẽ dừng ở đó, vì chuỗi C bị vô hiệu.

Nếu bạn thực sự cần giải phóng bộ nhớ đó, gần nhất bạn có thể nhận được là tạo một mảng mới, nhỏ hơn, sao chép các phần tử trên và delete[] mảng cũ.

char* TenCharactersLong = new char[10]; 
// ... 
char* FirstFiveCharacters = new char[5]; 
for (std::size_t Index = 0; Index < 5; Index++) 
{ 
    FirstFiveCharacters[Index] = TenCharactersLong[Index]; 
} 
delete[] TenCharactersLong; 
1

Không, xin lỗi. Việc cấp phát bộ nhớ đủ phức tạp với phân mảnh, căn chỉnh, đệm, chi phí, không có gì. Một tính năng như thế này sẽ chỉ khuếch đại thêm những vấn đề này.

Xóa thủ công các byte kết thúc không mong muốn bằng cách sử dụng các câu lệnh xóa riêng biệt một cách an toàn để làm những gì tôi yêu cầu?

Thậm chí không thử. Điều này có thể nguy hiểm. Luôn giải quyết các mảng bằng lệnh delete [].

tôi khuyên bạn nên đọc C++ FAQ Lite về chủ đề này: 16.13, 16.14

0

Không, bạn không thể làm điều đó. Tôi muốn đề nghị sử dụng một std :: vector cho việc này.Bằng cách này bạn có thể xác định các chỉ mục mà bạn muốn loại bỏ và chỉ cho phép các thư viện xử lý nó cho bạn.