2014-12-06 4 views
-3

Я только начал изучать C++ и пытался перенести некоторый PHP-код на данный момент.Новое в C++, обращенное к segfault

Я получаю Segfault из этого куска кода:

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;' или no return whatsoever –

+2

Да, как сказал Петр, 'delete this' является вашим преступником. Вам даже не нужен деструктор этого класса. Я предлагаю вам избавиться от него. – David

+0

Вы также обязательно захотите изменить свой конструктор так, чтобы имена параметров не имели те же имена, что и ваши переменные-члены. Вы указали левую часть задания на то, чтобы указать на переменные-члены, но неясно кому-то, незнакомому с стандартом C++, что «r» будет интерпретироваться как. Это может быть параметр или переменная-член. Возможно, все, что ваш конструктор делает, это назначить переменную-член самому себе, а не параметру. Хотя я не уверен, что диктует стандарт, или если это неопределенное поведение. – Ian

ответ

1

Чтобы расширить текущие ответы.

Причина, по которой вы не можете использовать удаление в этом случае, заключается в том, что, не используя ключевое слово «новое», вы создали объект в стеке, и он будет автоматически уничтожен, когда область, в которой он был создан, больше не Соответствующий.

Это полезно для объекта, такого как тот, который вы опубликовали, поскольку его малый и, что более важно, он не управляет какой-либо памятью внутри, что может привести к некоторым утечкам памяти.

Также, поскольку все внутри класса является общедоступным, вы можете подумать о создании его структуры.

1

Вы должны только позвонить delete о вещах, которые вы выделили new. Вы не разместили this с new, поэтому вы не должны называть его delete.

+2

Даже если OP _did_ использует 'new', вы не должны использовать' delete this'. –

Смежные вопросы