2011-08-25 93 views
9

Tôi gặp sự cố khi khởi tạo các mảng con trỏ. Những gì tôi tìm thấy biên dịch với gcc C++ (4.6.0) là:Khởi tạo mảng con trỏ C++

MyClass** a = new MyClass*[100]; 

Không phải lúc nào cũng initalize mảng con trỏ. (Phần lớn thời gian nó đã làm cho tôi một mảng của con trỏ null mà nhầm lẫn tôi)

MyClass** a = new MyClass*[100](); 

DOES khởi tạo tất cả các con trỏ trong mảng đến 0 (con trỏ null).

Mã tôi đang viết có nghĩa là phải di động trên nền tảng Windows/Linux/Mac/BSD. Đây có phải là một tính năng đặc biệt của trình biên dịch gcc C++ không? hoặc là tiêu chuẩn C++? Ở đâu trong tiêu chuẩn nó nói như vậy?

+0

Có lẽ bạn có nghĩa là 'MyClass ** a = MyClass mới * [100]() '. Có, trình khởi tạo 'mới' là một tính năng tiêu chuẩn. Tôi chỉ đang tìm kiếm một câu hỏi trùng lặp. –

+0

Không hoàn toàn trùng lặp vì nó hỏi tại sao không (không chính xác) thay vì tại sao: http://stackoverflow.com/questions/6717246/no-array-allocated-using-new-can-have-an-initializer .. nhưng đủ gần. Bỏ phiếu để đóng. –

+0

Phiên bản đầu tiên trả về bộ nhớ chưa được khởi tạo, tất nhiên * có thể * là NULL (không) nếu trước đó nó không được sử dụng. Hầu hết các hệ điều hành đều xóa bộ nhớ được cấp phát cho một quy trình vì lý do bảo mật. –

Trả lời

5

Việc khởi tạo giá trị này là chuẩn C++.

Tiêu chuẩn có liên quan nằm trong C++ 98 và C++ 03 §5.3.4/15. Trong C++ 98 nó đã được khởi tạo mặc định, trong C++ 03 và sau đó nó khởi tạo giá trị. Đối với con trỏ của bạn, cả hai đều giảm xuống mức không khởi tạo.

C++ 03 §5.3.4/15:

– Nếu mới initializer có dạng (), mục là giá trị khởi tạo (8,5);

Trong C++ 0x đoạn mà thay vào đó đề cập đến “ các quy tắc khởi tạo là 8,5 cho trực khởi ”, nơi mà trong N3290 (các doanh nghiệp FDI), bạn tìm về từ ngữ tương tự trong §8.5/16.

Cheers & h.,

+0

Câu trả lời hay! Exaclty những gì tôi đã hy vọng. Bây giờ tôi có thể mặc định/giá trị/không khởi tạo với sự tự tin. –

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