повысить ::сделать _общий не звонит (размещение )оператор новый?

Я впервые использую boost ::make _shared для создания объектов, на которые указывают общие указатели. Главным образом потому, что наш код был слишком медленным, а однократное выделение действительно помогло повысить производительность.

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

Я решил, что все, что мне нужно сделать, это переопределить «размещение нового» вместо «обычного» оператора new из-за следующего из документации сайта boost для make _shared:

«Эффекты :Выделяет память подходит для объекта типа Ти создает в нем объект с помощью выражения new new (pv )T ()или новый (pv )T (std ::forward (args )...). выделить _общий использует копию для выделения памяти. Если выброшено исключение, не имеет

Мое размещение new также не вызывается, однако. Я написал небольшую тестовую программу для воспроизведения поведения :

#include <iostream>
using namespace std;
#include "boost/shared_ptr.hpp"
#include "boost/make_shared.hpp"

class Test
{
public:
    Test() { cout << "Test::Test()" << endl; }

    void* operator new (std::size_t size) throw (std::bad_alloc) {
        cout << "Test new" << endl;
        return malloc(size);
    }

    void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw() {
        cout << "Test non-throwing new" << endl;
        return malloc(size);
    }

    void* operator new (std::size_t size, void* ptr) throw() {
        cout << "Test non-throwing placement new" << endl;
        return malloc(size);
    }
};

void* operator new (std::size_t size) throw (std::bad_alloc) {
    cout << "Global new" << endl;
    return malloc(size);
}

int main() {
    cout << "..." << endl;
    boost::shared_ptr<Test> t1(boost::make_shared<Test>());
    cout << "..." << endl;
    boost::shared_ptr<Test> t2(new Test());
    cout << "..." << endl;

    return 0;
}

, которая выводит следующий результат:

...
Global new
Test::Test()
...
Test new
Test::Test()
Global new
...

Я ожидал: «Проверить, не -бросая новое размещение " в 3-й строке вывода. Каким, по вашему мнению, должно быть поведение? Согласны ли вы с тем, что в соответствии с документацией make _shared он должен вызывать оператор размещения нового моего тестового класса? Или я неправильно его понял?

Я мог бы скопировать реализацию бустов локально и добавить вызов нового оператора размещения, конечно.Но будет ли это уместно или нарушит предполагаемую семантику размещения new?

Заранее благодарим за уделенное время и помощь.

6
задан Joost Sannen 12 March 2012 в 21:42
поделиться