2016-06-09 4 views
1

У меня есть ситуация, когда у меня есть существующий код, который работает с необработанными указателями, и мне не разрешено использовать smart-pointer-ify. Тем не менее, мне разрешено использовать интеллектуальные указатели в любом новом коде, который я разрабатываю.Интеграция интеллектуальных указателей с устаревшим кодом raw pointers

Например.

У меня есть существующие функции, как:

void processContent() 
{ 
    ContentObject * myContent = new ContentObject(); 
    newFunction(myContent); 
} 

void newFunction(ContentObject * content) 
{ 
    // myVector is just a std::vector<ContentObject*>, defined elsewhere 
    myVector.push_back(content); 
} 

void doSomethingWithContent() 
{ 
    // There is some logic here, but ultimately based on this logic I want to remove entries, and free the memory they point to. 
    myVector.pop_back(); 
} 

У меня есть контроль над содержанием "newFunction" и "doSomethingWithContent". Но аргумент, переданный в newFunction, фиксирован. Очевидно, я мог вручную удалить указатель в myVetor, прежде чем появляться, но я подумал, могу ли я реализовать интеллектуальные указатели здесь, чтобы это произошло «автоматически» для меня?

Могу ли я взять необработанный указатель, переданный в функцию, и превратить его в unique_ptr, а затем добавить его в контейнер и удалить его, когда он выскочил из контейнера?

Благодаря

Joey

ответ

1

Предположим, что вы можете определить myVector как:

std::vector<std::shared_ptr<ContentObject>> myVector; 

В этом случае вы можете переключиться на смарт-указатели в коде и myVector будет держать все ваши объектов, как вы ожидали:

void newFunction(ContentObject * content) 
{ 
    myVector.push_back(std::shared_ptr<ContentObject>(content)); 
} 

void doSomethingWithContent() 
{ 
    // There is some logic here, but ultimately based on this logic I want to  remove entries, and free the memory they point to. 
    myVector.pop_back(); 
} 

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

  • Нет связанных вопросов^_^