Это утечка памяти, потому что никто не удаляет вектор, который вы «новый».
Кроме того, почему есть указатель на вектор вообще? Вы беспокоитесь о том, что копировать его в конструктор дорого?
Изменить элемент, чтобы быть вектором:
class A{
public:
A(vector<CCPoint> p);
private:
vector<CCPoint> p;
}
Изменить конструктор использовать список Инициализатора:
A:A(vector<CCPoint> newP) : p(newP){
// Empty
}
И не называйте, как это:
Vector<CCPoint> p;
A a(p);
Никогда, создайте объект с «новым», если вы точно не знаете, почему вы это делаете, и даже тогда пересматриваете.
Замечание об исполнении: Да, это может привести к возникновению векторной копии, в зависимости от копирования экземпляра компилятором. Альтернативным решением для модных брюк C++ 11 было бы использовать перемещение:
class A{
public:
A(vector<CCPoint> p);
private:
vector<CCPoint> p;
}
A:A(vector<CCPoint> newP) : p(std::move(newP)){
// Empty
}
Vector<CCPoint> p;
A a(std::move(p)); // After this completes, 'p' will no longer be valid.
Так что же (помимо очевидных опечаток) не так? Если вам что-то особенное вам не нравится в этом подходе, вы должны сказать нам это. –
damn, у меня есть исключения с нулевым указателем, но теперь я вижу, что я использовал вектор, прежде чем инициализировать его. это происходит, если вы не спите в течение нескольких дней. @polka, честно говоря, я не использовал C++, поэтому я использовал это правило: «добавьте * перед каждой не примитивной переменной, и она будет работать как Java» по крайней мере, насколько я ее пережил. Я знаю, что это грубо ... спасибо за ваши ответы в любом случае –
_ «добавьте * перед каждой не примитивной переменной, и она будет работать как Java». Это ужасное правило. Он не будет работать как Java, потому что C++ не имеет сборщика мусора. – Chad