2017-08-24 109 views
0

我已經分配的對象數組作爲:刪除陣列C++崩潰問題

int numPlwDistanceClimb = 5; 
int numFl = 6; 
GRBVar** t_gd = 0; 
t_gd = new GRBVar* [numFl]; 
GRBVar* x = 0; 
x = model.addVars(numFl, GRB_CONTINUOUS); 
for (int k = 0; k < numFl; k++) 
{ 
    t_gd[k] = model.addVars(numPlwDistanceClimb, GRB_CONTINUOUS);   
} 

我刪除陣列如下,但它不工作。

delete x; 
for (int i = 0; i < numFl; ++i) 
{ 
     delete t_gd[i]; 
} 
     delete [] t_gd; 

任何人都可以幫我嗎?謝謝你在前進

+3

使用'的std :: VECTOR',而不是和你所有的問題將得到處理。 – NathanOliver

+0

你不會初始化這個代碼中的每個t_gd – Laurijssen

+0

我沒有看到任何你實際寫入't_gd'的代碼。如果你在未初始化的指針上調用free,那麼崩潰就是你所期望的。 – ypnos

回答

0

你必須至少把t_gc爲NULL的每一個元素,否則數組包含隨機值,當你刪除那些會崩潰

GRBVar** t_gd = 0; 
t_gd = new GRBVar* [numFl]; 

for (int i = 0; i < numFl; i++) 
{ 
    t_gd[i] = NULL; 
} 
+0

上次我錯過了我的代碼中的一些細節。請檢查它。謝謝 –

+0

nulling不應該是必需的,因爲任何條目都會在循環中填充 –

+0

model.addVars(numPlwDistanceClimb,GRB_CONTINUOUS);創建一個指向GRBVar的指針?有了新的或其他的東西? – Laurijssen

1

我已經分配的對象數組如:

不,您已分配指針數組指向對象。 這意味着如果要正確使用它,則必須分配該數組中的每個指針,否則嘗試使用它們會導致未定義的行爲。

GRBVar** t_gd = new GRBVar* [numFl]; 

for (int n = 0; n < numFl; n++) 
{ 
    t_gd[i] = new GRBVar; 
    // Or set them to nullptr 
} 

此外,如果您需要在C++中的指針數組,你可以使用std::vector

std::vector<GRBVar *> t_gd; 

如果你沒有分配,免費資源,你有辦法了更多的可能性。你

也可以使用smart pointers

std::vector< std::unique_ptr<GRBVar> > t_gd; 
+0

上次我錯過了我的代碼中的一些細節。請檢查它。謝謝 –

+0

如果'addVars'返回指向已分配內存的指針,它應該可以。你能提供給我們這個功能嗎? –