28. (单选题)下面的代码问题是( ) void func(int a ) { auto * const i = new int; if (a == 0) throw std::exception(“Error!“); delete i; } A 编译期不通过 B 悬垂指针 C 内存泄漏 D 以上都不对
时间: 2024-04-12 15:33:11 浏览: 13
C 内存泄漏
在这段代码中,我们可以看到在函数`func`中,通过`new`运算符动态分配了一个`int`类型的内存,并将其地址赋值给了指针变量`i`。然后,在条件判断`if (a == 0)`中,如果条件成立,会抛出一个`std::exception`异常。在异常抛出前,没有释放之前分配的内存,导致内存泄漏的问题。正确的做法是在函数结束前通过`delete`释放之前分配的内存。因此,选项C是正确答案。
相关问题
给下列代码生成的汇编语言文件增加注释。 int func1(int *arr, int size) { int cnt = 0; for(int i = 0; i < size; ++i) { cnt += arr[i]; } return cnt; } void func2(int a, int b) { int tmp = a; a = b; b = tmp; } void func3(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } int main() { int i = 1; int j = 3; int k = 5; int arr[6] = {1,2,3,4,5,6}; int res = func1(arr,6); func2(i, j); func3(&i, &k); return 0; }
为上述代码增加注释:
// func1: 计算数组中元素的总和
int func1(int *arr, int size) { int cnt = 0; for(int i = 0; i < size; i) { cnt = arr[i]; } return cnt; }// func2: 两个数值互换
void func2(int a, int b) { int tmp = a; a = b; b = tmp; } // func3: 两个指针指向的数值互换
void func3(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } // main: 主函数,调用func1、func2、func3
int main() { int i = 1; int j = 3; int k = 5; int arr[6] = {1,2,3,4,5,6}; int res = func1(arr,6); func2(i, j); func3(
#include <stdio.h> void func(int num) { *(int*)num = 6666; } int main() { int num = 1234; func((int)&num); printf("%d\n",num); }
这段代码存在一个问题。在函数 `func` 中,`num` 是作为指针传递给函数的。但是在函数中,它被强制转换为 `int*` 类型并尝试修改其值。然而,`num` 本身是一个整数值,而不是一个有效的内存地址。
这样的操作是非法的,并且可能导致程序崩溃或产生未定义的行为。如果您想要修改 `num` 的值,您可以将 `num` 声明为指针类型,并传递其地址给 `func` 函数。以下是修正后的代码:
```c
#include <stdio.h>
void func(int* num)
{
*num = 6666;
}
int main()
{
int num = 1234;
func(&num);
printf("%d\n", num);
return 0;
}
```
这样修改后,函数 `func` 中的参数 `num` 将接收到 `num` 的地址,然后通过解引用指针来修改 `num` 的值。在主函数中,我们将 `num` 的地址传递给 `func` 函数以实现修改。