这段时间写程序的时候发现 Linux 下 GCC 有一个问题,以下时简单代码测试
#include <iostream>
template<class Value>
void test(Value v){
if(0){
// 其实这里在正常情况下是不会触发下面语句的
// 但是当输入整数编译时,编译就不通过了
delete v;
}
printf("test\n");
}
int main(int arge,char *argv[])
{
test("rr"); // 这样编译是没问题的
// test(0); // 单如果把参数换成整数,上面的 if 语句就失效了,会编译出错
// 会提示:error: type ‘int’ argument given to ‘delete’, expected pointer
return0;
}
有没有哪位知道这是什么问题?如何解决?
不会触发运行,但会触发编译哈
我这只是举例,实际过程中不管你是判断的是什么都会被无视掉,即便是定量
不会触发运行,但会触发编译哈
delete一个整形就是语法错误
不触发编译可以使用#if 0 #endif他们中间的就是无效代码,不会检查语法的
delete用来释放new出来的动态内存,因此后面要跟一个指针。
C++ 中的 delete 运算符只能用于指针类型,而不能用于非指针类型。因此,当你将整数传递给 delete 运算符时,编译器会报错。
在你的代码中,当你调用 test(0) 时,整数 0 被隐式转换为指针类型,并传递给 test 函数。然后,在函数中的 delete v 语句中,你试图删除一个指向整数的指针,这是不允许的。
为了解决这个问题,你可以将 test 函数修改为接受指针类型的参数,而不是通用类型。这样,当传递整数时,就不会发生隐式转换,从而避免了错误。
#include <iostream>
template<class Value>
void test(Value* v) {
if (0) {
delete v;
}
printf("test\n");
}
int main(int argc, char* argv[]) {
test(new std::string("rr")); // 使用指针类型参数,不会触发错误
// test(0); // 传递整数会触发错误
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:回答:
这个问题出现的原因是在test
函数中,使用了delete
关键字来释放指针所指向的内存,但是delete
只能用于释放由new
关键字分配的内存,所以当整数作为参数传递时,编译器会报错。
要解决这个问题,可以通过以下方法:
test
函数中判断参数的类型,如果是整数类型,就不执行delete
语句。我们可以使用std::is_pointer
来判断参数是否为指针类型。#include <iostream>
#include <type_traits>
template<class Value>
void test(Value v) {
if(std::is_pointer<Value>::value){
delete v;
}
printf("test\n");
}
delete
的要求。我们可以使用new
关键字来为整数类型分配内存,并将其指针传递给test
函数。int main(int argc, char *argv[]) {
test("rr"); // 这样编译是没问题的
int* num = new int(0);
test(num); // 将整数参数进行指针化
delete num; // 释放内存
return 0;
}
注意,在使用完指针后,我们需要使用delete
来释放内存,以防止内存泄漏。
这样就解决了GCC编译器在使用整数参数时IF语句失效的问题。
delete的参数得是指针引用