GCC 里的 IF 语句失效故障

这段时间写程序的时候发现 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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/646614
  • 这篇博客你也可以参考下:GCC弱符号的一个应用示例
  • 您还可以看一下 韦东山老师的韦东山升级版嵌入式视频之快速入门课程中的 GCC编译器的使用小节, 巩固相关知识点
  • 除此之外, 这篇博客: gcc编程4步编译、调试c程序实操详解(Linux系统编程)中的 一、知识储备(想看实战往下翻) 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    回答:

    这个问题出现的原因是在test函数中,使用了delete关键字来释放指针所指向的内存,但是delete只能用于释放由new关键字分配的内存,所以当整数作为参数传递时,编译器会报错。

    要解决这个问题,可以通过以下方法:

    1. 首先,我们需要在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");
    }
    
    1. 然后,在程序的调用部分,我们需要将整数类型的参数进行指针化,以满足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的参数得是指针引用