Это приведет к утечке памяти в C++?

Вы также можете создать собственную карту: https://www.highcharts.com/docs/maps/custom-geojson-maps

или удалить Канарские острова из графического изображения точки. , но тогда они полностью исчезнут с карты:

    chart: {
        events: {
            load: function() {
                var point = this.series[0].points[0],
                    pathArr = point.graphic.attr('d').split('M');

                pathArr.shift();

                point.graphic.attr({
                    'd': 'M' + pathArr[3]
                });
            }
        }
    }

Демонстрационная версия: http://jsfiddle.net/BlackLabel/6oa08vyd/

API: [ 113] https://api.highcharts.com/class-reference/Highcharts.SVGElement#attr

6
задан tunnuz 24 January 2009 в 11:29
поделиться

7 ответов

Довольно очевидно, что Вы хотите возвратить новый объект вызывающей стороне, на которую Вы не должны сохранять ссылку. С этой целью самая простая вещь сделать состоит в том, чтобы возвратить объект значением.

OtherClass Class::my_method( ... ) {
    return OtherClass( ... );
}

Затем в коде вызова можно создать новый объект как это.

{
    Class m( ... );
    OtherClass n( m.mymethod( ... ) );
}

Это избегает любого беспокойства о возврате ссылки на временные файлы или требование клиента к удалению менеджера возвращенного указателя. Обратите внимание на то, что это действительно требует Вашего объекта быть copyable, но это - легальная и обычно реализовываемая оптимизация для копии, которой избежит при возврате значение.

Необходимо было бы только рассмотреть общий указатель или подобный при необходимости в совместно использованном владении или для объекта иметь время жизни вне объема функции вызова. В этом последнем случае можно оставить это решение до клиента и все еще возвратиться значением.

Например.

{
    Class m( ... );

    // Trust me I know what I'm doing, I'll delete this object later...
    OtherClass* n = new OtherClass( m.mymethod( ... ) );
}
6
ответ дан 8 December 2019 в 03:02
поделиться

Да, который приведет к утечке памяти.

То, что Вы сделаете, в операторе возврата, разыменуйте новый объект, который Вы создали. Компилятор вызовет оператор присваивания как часть возврата и скопирует СОДЕРЖАНИЕ Вашего нового объекта к объекту, которому это присвоено в вызывающем методе.

Новый объект оставят на "куче" и ее указателе, очищенном от стека, таким образом создавая утечку памяти.

Почему бы не возвратить указатель и управлять им тот путь?

12
ответ дан 8 December 2019 в 03:02
поделиться

Вызов деструктора и освобождение памяти являются двумя отличными вещами в C++.

delete действительно оба называет деструктор и освобождает память. delete[] называет деструктор для выделенного числа элементов, затем освобождает память.

Когда OtherClass выходит из объема, деструктор называют, но память не освобождена.


Как предложение, когда Вы чувствуете, что Вы полностью понимаете указатели в C++, изучают интеллектуальные указатели, например, повышают интеллектуальные указатели для упрощения жизни управления памятью в C++. (например, см. статью здесь для введения) ,
5
ответ дан 8 December 2019 в 03:02
поделиться

Обычно, когда локальный объект выходит из объема, это - память, освобожден только потому, что он выделяется на стеке, и стек очищен автоматически. Так как Ваш объект выделяется на "куче", нет никакого способа, которым это может быть автоматически освобождено. Единственный способ освободить его состоит в том, чтобы звонить, удаляют явно.

Я думаю, что, вероятно, можно сделать это:

Объявите другой класс DummyClass, которые содержат общедоступного участника, который является указателем на OtherClass объект. В конструкторе DummyClass очистите указатель на ПУСТОЙ УКАЗАТЕЛЬ. В Вашей функции объявите объект типа DummyClass, и его членский указатель для создания другого объекта типа OtherClass. Затем в деструкторе DummyClass, проверьте, является ли указатель НУЛЕВЫМ, если это не, удалите его. Таким образом Ваш объект будет очищен автоматически, когда объект DummyClass выйдет из объема.

2
ответ дан 8 December 2019 в 03:02
поделиться

Если возможный можно рассмотреть станд.:: auto_ptr или boost/c0x shared_ptr для упрощения управления памятью.

2
ответ дан 8 December 2019 в 03:02
поделиться

У Вас есть 2 объекта OtherClass:

Каждый - n, который создан на стеке и успешно удален, когда выходит из объема.

Другой является тем, который Вы создаете на "куче", внутри my_method. Этот никогда не удаляется, и это приведет к утечке памяти.

2
ответ дан 8 December 2019 в 03:02
поделиться

Если Вы настаиваете на выделении стека, не используйте new оператор в my_method() и передайте ссылку на n вместо этого, т.е.:

void Class::my_method( OtherClass& other_object, ... ) {
    other_object.init( ... );
}

Затем звоните my_method() как это:

{
    Class m( ... );
    OtherClass n;
    m.my_method( n, ... );
}

Чтобы этот шаблон работал, Class должен реализовать некоторый init() метод, который позволяет правильно инициализировать объекты, не вызывая конструктора.

2
ответ дан 8 December 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: