2017-08-24 140 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'返回指向已分配内存的指针,它应该可以。你能提供给我们这个功能吗? –