目前,我正在使用C ++进行大量编程。有时我偶然发现了C ++语言的具体问题。通常很难与应用程序域一起处理以编程方式解决特定问题并另一方面处理C ++问题。
一个例子:
class Animal {
public:
Animal ();
Animal (const char* name);
virtual ~Animal();
const char* getName() const;
private:
char* _name;
};
在这个课程中,我有一个指针作为成员。所以我将在构造函数中动态创建它,并在析构函数中删除它。
问题是,如果我自己没有指定Copy-Constructor,生成的Copy-Constructor只会将指针本身复制到新的Copy-Object。这意味着对每个复制的对象都可以使用这些对象的一个指针所指向的数据的任何更改。所以我必须自己定义一个Copy-Constructor 和赋值运算符来复制指针指向的值。
Animal::Animal(const Animal& other)
{
if(_name) {
delete [] _name;
}
_name = new char[strlen(other.getName()) + 1];
strcpy(_name,other.getName());
}
另一个C ++特定问题:
如果我不使用Descructor virtual
,那么如果我在超类型上使用delete
,则不会调用子类的析构函数。
C ++中有很多东西常常会产生很多难以找到的问题。
是否有任何代码分析工具可以搜索此类问题并显示一些提示,这些提示可能在某一时候出错?
答案 0 :(得分:2)
编译器可以是静态查找问题的伟大的帮助源。例如,我使用g++ -Wall -Wextra -Werror -Wno-ignored-qualifiers -Wno-long-long -pedantic -Wreturn-type -Wswitch -Wnon-virtual-dtor
来捕获各种代码问题。
您可以做的第二件事是编写C ++,而不是C.使用RAII来管理资源,最好让其他人编写必须进行显式管理的代码(例如智能指针和标准容器)。这样,编译器可以自动隐式生成正确的复制语义,从而防止完全独立的问题集。
答案 1 :(得分:1)
是否有任何代码分析工具可以搜索此类问题并显示一些可能在某一时间出错的提示?
是的,有很多tools for static code analysis。一些(如parasoft's tool)您可以详细配置以捕获所有类型的问题。
答案 2 :(得分:1)
这个question包含了很多很好的答案。最佳结果谷歌搜索C ++和lint。
答案 3 :(得分:0)
听听Fanael的建议。
在编译器中启用大多数警告并将其视为(潜在)错误。
关于静态代码分析,请阅读:http://altdevblogaday.com/2011/12/24/static-code-analysis/
此外,cppcheck是一款免费且跨平台的工具,请试一试。