2010-03-18 38 views
19

Mọi lúc và sau đó tôi cần gọi new[] cho các loại được cài sẵn (thường là char). Kết quả là một mảng với các giá trị chưa được khởi tạo và tôi phải sử dụng memset() hoặc std::fill() để khởi tạo các phần tử.Làm thế nào tôi có thể tạo `new []` default-initialize mảng các kiểu nguyên thủy?

Làm cách nào để tạo new[] khởi tạo mặc định các yếu tố?

+7

Tôi không chắc liệu điều này có hợp lệ hay không nhưng hoạt động tốt trên VC9. 'int * p = new int [10]();' – Naveen

Trả lời

25

int* p = new int[10]() nên làm.

Tuy nhiên, như Michael points out, sử dụng std::vector sẽ tốt hơn.

+2

Bạn cũng có thể cú pháp khởi tạo đồng nhất C++ 11: 'new int [10] {}'. –

+2

@Fernando: Bây giờ bạn có thể cảm ơn vì đã chỉ ra điều này. Bạn đã có một thời gian khó tìm một trình biên dịch chấp nhận rằng vào tháng 5 năm 2010, mặc dù. ':)' – sbi

22

Tại sao bạn không chỉ sử dụng tiêu chuẩn :: vector? Nó sẽ tự động làm điều đó cho bạn.

 
std::vector<int> x(100); // 100 ints with value 0 
std::vector<int> y(100,5); // 100 ints with value 5 

Điều quan trọng cần lưu ý là việc sử dụng vectơ tốt hơn, vì dữ liệu sẽ bị hủy đáng tin cậy. Nếu bạn có một tuyên bố new[], và sau đó một ngoại lệ sau đó được ném, dữ liệu được phân bổ sẽ bị rò rỉ. Nếu bạn sử dụng một std :: vector, thì destructor của vectơ sẽ được gọi ra, làm cho dữ liệu được deallocated đúng cách.

+2

Tôi hoàn toàn đồng ý rằng vector thường tốt hơn, nhưng tôi vẫn muốn [] mới. +1 anyway. – sharptooth

1

Chủ đề tương đối cũ này hiện có thể được tăng cường bằng một biến thể khác. Tôi đã sử dụng bool, bởi vì có một chuyên môn khá xa lạ đối với vector<bool>

#include <memory> 
... 
unique_ptr<bool[]> p{ new bool[count] {false} }; 

này bây giờ có thể được truy cập với operator[]

p[0] = true; 

giống như std::vector<T> này là an toàn ngoại lệ.

(Tôi cho rằng điều này không thể quay lại vào năm 2010 :))

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