2014-12-06 53 views
-3

我刚开始学习C++,并尝试移植一些PHP代码。面向段错误的C++新手

class Color { 

public: 

    // Props 
    int r; 
    int g; 
    int b; 
    int a; 

    // Constructor 
    Color (int r, int g, int b, int a) { 
     this -> r = r; 
     this -> g = g; 
     this -> b = b; 
     this -> a = a; 
    }; 

    // Destructor 
    ~Color() { 
     delete this; 
    }; 

    // Mix 2 colors 
    void mixColor (const Color& c) { 
     this -> r = (this -> r + c.r)/2; 
     this -> g = (this -> g + c.g)/2; 
     this -> b = (this -> b + c.b)/2; 
     this -> a = (this -> a + c.a)/2; 
    }; 
}; 

而且在主文件:

我从这段代码获得一个段错误

int main() { 

    Color myColor (10, 20, 30, 40); 
    return 1; 
} 

任何想法是什么原因造成的呢?

谢谢。

+8

1.不要使用'delete this;',2。'return 1;' - >'return 0;'或不返回 – 2014-12-06 19:23:57

+2

是的,正如Piotr所说,“删除这个”是你的罪魁祸首。你甚至不需要该类的析构函数。我建议你摆脱它。 – David 2014-12-06 19:26:57

+0

您也肯定会想要更改您的构造函数,以便参数名称与您的成员变量名称不同。你已经作用域分配的左手指向成员变量,但其不清楚别人不熟悉C++标准是什么“R”将被解释为。它可能是参数或成员变量。也许你承滴盘构造函数是成员变量分配给本身,而不是到参数,虽然我不知道什么是标准规定或者如果没有定义的行为。 – Ian 2014-12-06 19:29:04

回答

1

展开当前答案。

在这种情况下,您不能使用delete的原因是,通过不使用'new'关键字,您在堆栈上创建了该对象,并且当它创建的范围不再被自动销毁相关。

这是一个非常有用的对象,如您发布的一个,因为它的小,更重要的是,它不管理任何形式的记忆在内部,这可能导致一些内存泄漏。

此外,由于类内的所有内容都是公共的,因此您可以考虑将其设为结构。

1

您只能拨打deletenew分配的东西。您没有将this分配给new,因此您不应该在其上拨打delete

+2

即使OP _did_使用'new',你也不应该使用'delete this'。 – 2014-12-06 19:29:49