2010-12-16 49 views
3

我做的指針一些時髦的東西。我擔心我可能要離開自己開放一些指針問題:正確處理的建議,這是明智的嗎?

#include <iostream> 

class Vector2 
{ 
private: 
double x; 
double y; 

public: 
Vector2(double x, double y) 
{ 
    this->x = x; 
    this->y = y; 
} 

Vector2(double coords[2]) 
{ 
    x = coords[0]; 
    y = coords[1]; 
} 

typedef double * const dArr; 
operator dArr() 
{ 
    double out[2] = {x, y}; 
    return out; 
} 
}; 

int main() 
{ 
double ids[2] = {2.3 ,3.3}; 
Vector2 v = ids; 
std::cout << 5 << std::endl; 
double vect[2] = {v[0], v[1]}; 
double * const v2 = v; 

std::cout << vect[0] << " " << vect[1] << std::endl; 

while(1) { } 

return 0; 
} 

在運營dArr()函數在我的Vector2類我擔心通過返回一個指針我打開自己,直到指針不會被刪除的問題,它會導致內存泄漏。我有權擔心,在這種情況下是否有解決方案來防止內存泄漏?任何建議都會受到歡迎。

謝謝。

+0

正如答案中指出的那樣,這不是泄漏,儘管這是一個問題。但是,如果您是泄漏點,您可能會返回某種智能指針。 – 2010-12-16 17:42:40

+0

@David Thornley:如果我要在main()中爲v2分配一個新指針,那麼原指針是不是會被泄漏? – 2010-12-16 17:51:22

+0

不,指針是靜態分配的,所以當它在主結束時超出範圍時它將被釋放。指針指向的內存(這是你通常會泄漏的內存)也是靜態分配的,並且已經超出了範圍,所以它已經被釋放了! – Kleist 2010-12-16 17:55:40

回答

2

沒有泄漏。一般來說,如果你不記憶任何內容,你不能泄漏內存。但是你要返回一個局部變量的地址,這會導致未定義的行爲。

解決方案1: 你可以使用一個靜態雙[2]在操作DPTR():

方案2(越好): 商店X和Y在雙[2]在您的類,並返回一個指向它,而不是:

#include <iostream> 

class Vector2 
{ 
private: 
    double coords_[2]; 

public: 
    Vector2(double x, double y) 
    { 
     coords_[0] = x; 
     coords_[1] = y; 
    } 

    Vector2(double coords[2]) 
    { 
     coords_[0] = coords[0]; 
     coords_[1] = coords[1]; 
    } 

    typedef const double* const dArr; 
    operator dArr() const 
    { 
     return coords_; 
    } 
}; 

int main() 
{ 
    double ids[2] = {2.3 ,3.3}; 
    Vector2 v = ids; 
    std::cout << 5 << std::endl; 
    double vect[2] = {v[0], v[1]}; 
    const double * const v2 = v; 

    std::cout << vect[0] << " " << vect[1] << std::endl; 

    while(1) { } 

    return 0; 
} 

我在double *前面加const的,因爲它是你指向的是常量。 (如果你不想讓你的班級的用戶擺弄你的私人成員。)

+0

謝謝,我現在明白了。 – 2010-12-16 18:07:50

0

你有不同的問題,你的記憶會在退貨時被清除。但沒有泄漏:P的結果應該是垃圾......返回這樣一個指針的正確方法確實是new'ed內存或靜態內存(不是一個好的選擇,但非常快),新的內存可能確實不會被刪除,你可以返回一個std :: vector。

0

你最好使用靜態數組容器,如boost::array<double, 2>。本地數組具有可怕的語法和語義 - 如果您想要在該類型的容器中返回一個數組,您可以像往常一樣返回一個引用。