我可以删除作为参数传递给函数的 double* 吗?
Can I delete a double* passed to a function as a parameter?
我编写了以下函数来为 double*
数组动态分配内存:(我也为 int*
编写了一个类似的函数)
void add_memory(double* double_array, int current_idx, int max)
{
max = max * 2;
double* temp_double_array = new double[max];
for (int i = 0; i < current_idx; i++) {
temp_double_array[i] = double_array[i];
}
delete [] double_array;
double_array = temp_double_array;
}
我这样调用这个函数:
int n_max = 10;
int m_max = 10;
double* val = new double[n_max];
int* col_ind = new int[n_max];
int* row_ptr = new int[m_max];
int n = 0;
int m = 0;
for (int i = 0; i < sz; i++) {
int first_val_ind = -1;
for (int j = 0; j < sz; j++) {
if (B[i][j] == 0) {
if (n == n_max) {
add_memory(val, n, n_max);
add_memory(col_ind, n, n_max);
n_max = n_max * 2;
}
val[n] = B[i][j];
col_ind[n] = j;
if (first_val_ind == -1) {
if (m == m_max) {
add_memory(row_ptr, m, m_max);
m_max = m_max * 2;
}
first_val_ind = n;
row_ptr[m] = first_val_ind;
m++;
}
n++;
}
}
}
我收到一个错误,据 this SO question 看来是因为我正在删除尚未声明的内存。
我的错误是:*** glibc detected *** ./mm2: free(): invalid next size (fast): 0x00000000016ae220 ***
是不是因为我想在本地删除一个全局变量?
问题是您要删除同一个数组两次。想想这里发生了什么:
void add_memory(double* double_array, int current_idx, int max)
{
// ...
delete [] double_array;
double_array = temp_double_array; // <== double_array is local to add_memory
// so this line has no effect
}
您用 val
调用它,val
会被删除。但是在循环的下一次迭代中,您再次使用 val
调用它。但是 val
已经被删除了!当然,您在 add_memory
中分配了一个新数组,但函数外部的任何内容都无法访问它。你需要return
它:
double* add_memory(double* double_array, int current_idx, int max)
{
// ...
delete [] double_array;
return temp_double_array;
}
然后你必须覆盖val
:
val = add_memory(val, n, n_max);
请注意,您仍然需要在程序结束时 delete []
所有数组,因为现在它们正在被泄露。
(关于在这里使用 vector
的标记注释)。
传递对指针的引用应该有效:
void add_memory(double*& double_array, int current_idx, int max)
{
max = max * 2;
double* temp_double_array = new double[max];
for (int i = 0; i < current_idx; i++) {
temp_double_array[i] = double_array[i];
}
delete [] double_array;
double_array = temp_double_array;
}
这不需要您return任何事情。
我编写了以下函数来为 double*
数组动态分配内存:(我也为 int*
编写了一个类似的函数)
void add_memory(double* double_array, int current_idx, int max)
{
max = max * 2;
double* temp_double_array = new double[max];
for (int i = 0; i < current_idx; i++) {
temp_double_array[i] = double_array[i];
}
delete [] double_array;
double_array = temp_double_array;
}
我这样调用这个函数:
int n_max = 10;
int m_max = 10;
double* val = new double[n_max];
int* col_ind = new int[n_max];
int* row_ptr = new int[m_max];
int n = 0;
int m = 0;
for (int i = 0; i < sz; i++) {
int first_val_ind = -1;
for (int j = 0; j < sz; j++) {
if (B[i][j] == 0) {
if (n == n_max) {
add_memory(val, n, n_max);
add_memory(col_ind, n, n_max);
n_max = n_max * 2;
}
val[n] = B[i][j];
col_ind[n] = j;
if (first_val_ind == -1) {
if (m == m_max) {
add_memory(row_ptr, m, m_max);
m_max = m_max * 2;
}
first_val_ind = n;
row_ptr[m] = first_val_ind;
m++;
}
n++;
}
}
}
我收到一个错误,据 this SO question 看来是因为我正在删除尚未声明的内存。
我的错误是:*** glibc detected *** ./mm2: free(): invalid next size (fast): 0x00000000016ae220 ***
是不是因为我想在本地删除一个全局变量?
问题是您要删除同一个数组两次。想想这里发生了什么:
void add_memory(double* double_array, int current_idx, int max)
{
// ...
delete [] double_array;
double_array = temp_double_array; // <== double_array is local to add_memory
// so this line has no effect
}
您用 val
调用它,val
会被删除。但是在循环的下一次迭代中,您再次使用 val
调用它。但是 val
已经被删除了!当然,您在 add_memory
中分配了一个新数组,但函数外部的任何内容都无法访问它。你需要return
它:
double* add_memory(double* double_array, int current_idx, int max)
{
// ...
delete [] double_array;
return temp_double_array;
}
然后你必须覆盖val
:
val = add_memory(val, n, n_max);
请注意,您仍然需要在程序结束时 delete []
所有数组,因为现在它们正在被泄露。
(关于在这里使用 vector
的标记注释)。
传递对指针的引用应该有效:
void add_memory(double*& double_array, int current_idx, int max)
{
max = max * 2;
double* temp_double_array = new double[max];
for (int i = 0; i < current_idx; i++) {
temp_double_array[i] = double_array[i];
}
delete [] double_array;
double_array = temp_double_array;
}
这不需要您return任何事情。