2009-08-13 23 views
9

Đây là phương pháp để tạo một biến trên heap trong C++:Bạn có thể khai báo một con trỏ trên heap không?

T *ptr = new T; 

ptr đề cập đến một con trỏ đến T mới, rõ ràng. Câu hỏi của tôi là, bạn có thể làm điều này:

T *ptr = new T*; 

Điều đó có vẻ như nó có thể dẫn đến một số mã rất, rất nguy hiểm. Có ai biết nếu điều này là có thể/làm thế nào để sử dụng nó đúng cách?

+0

C++ rất nhất quán trong mọi ngôn ngữ con * * – AraK

+0

Trong khi bạn đã có câu trả lời cho bạn thấy cú pháp, cho đến nay không ai hỏi bạn tại sao bạn cần điều này. Nó chắc chắn có vẻ đáng nghi với tôi. – sbi

+1

Tôi nghĩ nó thật thú vị. Tôi chưa bao giờ nghĩ đến điều đó. Tôi không có nhu cầu cho nó (bên cạnh đó, có lẽ, tối ưu hóa thói quen hiếm khi được sử dụng để tiêu thụ bộ nhớ). – jkeys

Trả lời

33
int** ppint = new int*; 
*ppint = new int; 

delete *ppint; 
delete ppint; 
4

Có, bạn có thể khai báo con trỏ tới con trỏ ... và có, con trỏ sẽ nằm trên vùng heap.

7

new T* trả về một con trỏ đến một con trỏ đến một T. Vì vậy, việc kê khai không đúng, nó phải là:

T** ptr = new T*; 

Và nó sẽ nằm trên heap.

2

Bạn không thể làm

T *ptr = new T*; 

kể từ khi kiểu trả về của new foo là "con trỏ đến foo" hoặc foo *.

Bạn có thể làm

T **ptr = new T*; 
3

Nó được đề cập như là lý do tại sao bạn có thể cần một cái gì đó như thế này. Điều mà nói đến cái tâm là một mảng năng động. (Hầu hết các triển khai vectơ đều sử dụng thực tế này.)

// Create array of pointers to object 
int start = 10; 
SomeObject** dynamic = new SomeObject*[start]; 
// stuff happens and it gets filled 
// we need it to be bigger 
{ 
    SomeObject** tmp = new SomeObject*[start * 2]; 
    for (size_t x = 0; x < start; ++x) 
     tmp[x] = dynamic[x]; 
    delete [] dynamic; 
    dynamic = tmp; 
} 
// now our dynamic array is twice the size 

Kết quả là chúng tôi sao chép một loạt các con trỏ để tăng mảng của chúng, chứ không phải chính các đối tượng.

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