c ++:如果退出,则在if-else条件下定义数组会被删除

问题描述

我有一个脚本,可以通过使用函数来填充数组,也可以不使用函数。

它接受一个参数readmode,它决定是否使用该函数;还有一个参数len_arr,它决定了数组的长度。

我简化了代码,以便每次迭代时数组长度每次迭代都会增加,但是在实际情况下,每次迭代都会加载音频文件,以使它们具有不同的长度,因此我使用malloc进行初始化,然后我将其释放一次完成了后处理。

主脚本

// imports
  #include <iostream>     /* cout */
  #include <stdio.h>      /* printf */
  #include <stdlib.h>     /* atoi */
  using namespace std;

  void function_1(int len_arr,double * output_buffer){
    for (int j=0; j<len_arr; ++j){
      output_buffer[j] = 1.0*j;
    }
  }


int main (int argc,char ** argv) {
  int readmode = atoi(argv[1]);

  // double *buffer;
  // cout << "1 : Memory Address of buffer="<<buffer << endl;

  for (int len_arr=1; len_arr<=5; ++len_arr){

    if (readmode==1){
      double *buffer = (double *)malloc(len_arr * sizeof(double));
      function_1(len_arr,(double*)buffer);
      cout << "\n2 : Memory Address of buffer="<<buffer << endl;
      printf("readmode=1 : buffer[:5]=[%f %f %f %f %f]\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]);

    } else if (readmode==2){
      double *buffer = (double *)malloc(len_arr * sizeof(double));
      for (int j=0; j<len_arr; ++j){
        buffer[j] = 1.0*j;
      }
      cout << "\n3 : Memory Address of buffer="<<buffer << endl;
      printf("readmode=2 : buffer[:5]=[%f %f %f %f %f]\n",buffer[4]);
      
    }

  /* Do my post-processing with buffer */

  // verbose
    cout << "\n4 : Memory Address of buffer="<<buffer << endl;
    printf("readmode=%i : buffer[:5]=[%f %f %f %f %f]\n",readmode,buffer[4]);
    free(buffer);

  }
  return 0 ;
}

我这样编译它

g++ -o ./debug_ifelse.out -Ofast -Wall -Wextra -std=c++11 "./debug_ifelse.cpp"

这是我面临的问题:

  1. 如果我在输入if-else之前未初始化double *buffer,则即使没有在每个条件中都定义它,也会收到未声明的编译错误。
./debug_ifelse.cpp: In function ‘int main(int,char**)’:
./debug_ifelse.cpp:41:48: error: ‘buffer’ was not declared in this scope
     cout << "\n4 : Memory Address of buffer="<<buffer << endl;
                                                ^
./debug_ifelse.cpp: At global scope:
./debug_ifelse.cpp:14:15: warning: unused parameter ‘argc’ [-Wunused-parameter]
 int main (int argc,char ** argv) {
               ^
  1. 当我初始化它时(尽管我看不到它的含义),if-else之外和之内的变量double *buffer似乎位于不同的内存地址中,并且我无法访问其中定义的变量if-else。
1 : Memory Address of buffer=0

2 : Memory Address of buffer=0x24f3030
readmode=1 : buffer[:5]=[0.000000 0.000000 0.000000 0.000000 0.000000]

4 : Memory Address of buffer=0
Segmentation fault

解决方法

取消注释// // * buffer;应该在for循环的上方定义缓冲区。

double *buffer;

在if-else块中,仅使用缓冲区而不定义缓冲区。

buffer = (double *)malloc(len_arr * sizeof(double));
,

读取错误:

./debug_ifelse.cpp: In function ‘int main(int,char**)’:
./debug_ifelse.cpp:41:48: error: ‘buffer’ was not declared in this scope
     cout << "\n4 : Memory Address of buffer="<<buffer << endl;

看看第41行-您使用变量buffer,因此,如果在第40行中将其注释掉,则不会在范围内声明它-就像错误所示。

请注意,如果确实在第40行声明了它,那么此行。

double *buffer = (double *)malloc(len_arr * sizeof(double));

创建另一个(不同的)同名变量(可能不想使用)。使其buffer = (double *)malloc(len_arr * sizeof(double));

请注意,您确实需要在第40行上使用buffer,因为在free(buffer)循环之后,因此在该范围内是必需的。

旁注:

  • 因为您的循环一直在说buffer = malloc(...,您在泄漏 记忆
  • 如果您使用的是C ++,为什么要使用malloc / free而不是new / delete?

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...