2013-06-01 36 views
7

Tôi có một câu hỏi.C++ new * char không trống

Tôi đang phát triển máy chủ trong ASIO và các gói nằm trong char trỏ.

Khi tôi tạo char mới (ví dụ: char * buffer = new char[128];), tôi phải làm sạch nó theo cách thủ công để trống.

bởi:

for(int i =0;i<128;i++) 
{ 
buffer[i] = 0x00; 
} 

tôi làm điều gì sai, mà char là không rõ ràng?

+0

Câu hỏi của bạn đã được trả lời bởi [Làm các dấu ngoặc đơn sau tên loại có tạo sự khác biệt với mới không?] (Http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name -make-a-different-with-new). – Troubadour

Trả lời

19

Bạn không cần phải để lặp qua một mảng các giá trị un-khởi tạo. Bạn có thể tự động khởi tạo mảng số không như sau:

char * buffer = new char[128](); // all elements set to 0 
          ^^ 
3

Bộ nhớ phân bổ sẽ không rõ ràng, thay vào đó nó sẽ chứa nội dung ngẫu nhiên. Đó là cách phân bổ bộ nhớ hoạt động. Bạn phải chạy một đường dây for hoặc sử dụng memset để xóa thủ công.

-5

Vì nó là một con trỏ, bạn phải làm điều đó như thế:

for(int i = 0; i < 128; i++) 
{ 
(buffer + i) = 0x00; 
} 
+1

-1: Mã sai (gán 0x00 để rvalue) và lời khuyên là sai (mã của OP không biên dịch, không phải của bạn). – milleniumbug

+0

1. Bạn quên dereference LHS vì vậy bạn đang cố gắng gán cho r-value (mã của bạn sẽ không biên dịch). 2 'buffer [i]' là theo chuẩn ngôn ngữ giống như '* (buffer + i)'. Trong khi mảng và con trỏ * ĐANG * khác nhau theo tiêu chuẩn ngôn ngữ trong ngữ cảnh này, chúng có thể hoán đổi cho nhau ở một mức độ nào đó. –

11

Có hai loại cách gọi toán tử mới trong C++ - được khởi tạo mặc định và không được khởi tạo.

Để mặc định khởi (mà sẽ rời khỏi xác định giá trị) gọi:

int * i = new int; 

Đó là sau đó không xác định behavoir để đọc hoặc sử dụng giá trị này cho đến khi nó được thiết lập.

Để zeroinitialise (mà sẽ đặt thành 0) sử dụng:

int * i = new int(); 

này cũng làm việc với mảng:

int * i = new int[4]; // ints are not initialised, you must write to them before reading them 
int * i = new int[4](); // ints all zero initialised 

Có một số thông tin hơn here

2

Bạn cũng có thể sử dụng calloc. Nó khởi tạo mỗi elem đến 0 automaticaly. ví dụ:

char* buffer = (char *) calloc (128, sizeof (char)) 

Thông số đầu tiên là số khối được phân bổ. Thứ hai là kích thước của khối. Chức năng này trả về void * vì vậy bạn phải chuyển đổi giá trị thành (char *) Nếu bạn sử dụng hàm phân bổ calloc (hoặc malloc hoặc bất kỳ "pure c"), bạn nên sử dụng hàm free để deallocate bộ nhớ thay vì xóa.

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