This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Compiler/TDA2EVM5777:Dovering DELETE OPERATOR出现问题

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/577256/compiler-tda2evm5777-issue-while-overloading-delete-operator

部件号:TDA2EVM5777

工具/软件:TI C/C++编译器

大家好

我正在研究A15内核上的过载删除运算符,它使用 gcc-arm-none-eabi-4_7-2013q3作为编译器。下面是我使用的代码段

void运算符delete (void *PFS)

printf ("已删除地址:%x \n",PFS);
免费(PFS);

返回;

}

void运算符删除[](void *PFS)

删去运算符(PFS);
}

void deletep(const char *file, int LineNo)

const char *fname_detdelete;
fname_deete = print_file_name (file);
printf ("已删除内存@文件%s \t ",fname_deete);
printf ("行号%d \n ",行号);
返回;
}

#define new (__file__,__line__)
#define delete deletep(__file__,__line___),delete

在上面的代码中,它会编译,但当我执行此代码时,不会调用deletep函数。  当我在使用gcc 4.6 的Linux平台上运行相同的代码时,它会执行函数(del件deletep),然后删除运算符会因用户提供的函数而过载。 我想知道是什么导致了这种有线行为?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请向我们展示一个代码示例,该代码调用您的DELETE宏,TI编译器无法调用deletep
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    我可以提供一个适用于Linux的示例,如下所示

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    void运算符delete (void *);
    void运算符delete [](void *);
    void deletep (const char *,int);

    内联const char * print_file_name (const char *路径)

    对于(size_t i = strlen (path)- 1;i;i --)

    如果((path[i]=='/')||(path[i]=='\\'))

    返回路径[I + 1](&P);
    }
    }
    }

    void运算符delete (void *PFS)

    printf ("已删除地址:%x \n",PFS);
    免费(PFS);
    返回;
    }

    void运算符删除[](void *PFS)


    删去运算符(PFS);
    }

    void deletep(const char *file, int LineNo)


    const char *fname_detdelete;
    fname_deete = print_file_name (file);
    printf ("已删除内存@文件%s \t ",fname_deete);
    printf ("行号%d \n ",行号);

    返回;
    }

    #define delete deletep(__file__,__line___),delete

    类aclass

    私人:
    Int编号;
    char mychar;
    公开:
    aclass(int num, char mychar):num(num), mychar(mychar){}
    aclass(){ num =0;mychar ='a';}
    };

    int main (int argc,char *argv[])

    int *a =新int (100);
    aclass *b = new aclass(100,'b');
    aclass *c = new aclass[2];
    删除;
    删除b;
    删除[]c;
    返回0;

    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    确保函数print_file_name返回一个值,即使在路径名中找不到目录分隔符。 当我修复此问题并使用C6x编译器版本7.4 .19进行编译时,我得到了似乎正确的答案:

    内存已删除@文件foo.cpp行号61
    已删除地址:8000.6008万
    内存已删除@文件foo.cpp行号62
    已删除地址:8000.6018万
    内存已删除@文件foo.cpp行号63
    删除地址:8000.6028万

    确保您有足够的堆栈和堆空间。 您使用的是哪个版本的编译器?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好  

    感谢您的回复。 我正在使用 针对A15的gcc-arm-none-eabi-4_7-2013q3编译器。 请你用我提到的gcc版本编译并执行这个程序吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我当时正在研究这个问题,并尝试在这个特定的设置中重现这个问题。  

    请查看此帖子末尾的附加项目。 它包含GCC所需的所有参数,我能够在AM572x EVM板上运行测试用例。  

    注意:项目在外部DDR上运行,因此要求您的目标配置使用板(我正在使用上面屏幕截图中的配置)。  

    希望这能有所帮助,

    拉斐尔

    e2e.ti.com/.../AM572x_5F00_CA15_5F00_testcase.zip