У меня есть некоторый фон в Java (и недавно на C#) и хотелось бы лучше узнать C++. Я думаю, что я знаю некоторые основы различий в управлении памятью (и другими ресурсами) между этими языками. Это, возможно, небольшой вопрос, связанный с использованием dispose pattern и различными функциями, доступными на этих языках, чтобы помочь в этом. Мне нравится то, что я собрал из принципов RAII and SBRM, и я пытаюсь понять их дальше.Dispose pattern в C++ vs Java и C#
Пусть у меня есть следующий класс и метод в Java
class Resource implements Closeable {
public void close() throws IOException {
//deal with any unmanaged resources
}
}
...
void useSomeResources() {
try(Resource resource = new Resource()) {
//use the resource
}
//do other things. Resource should have been cleaned up.
}
или достаточно близко C# аналог
class Resource : IDisposable
{
public void Dispose()
{
//deal with any unmanaged resources
}
}
...
void UseSomeResources()
{
using(var resource = new Resource())
{
//use the resource
}
//do other things. Resource should have been cleaned up.
}
Правильно ли я думать, что идиома лучше представляя такое же поведение в C++ будет быть следующим?
class Resource {
~Resource() {
cleanup();
}
public:
void cleanup() {
//deal with any non-memory resources
}
};
...
void useSomeResources()
{
{
Resource resource;
//use the resource
}
//do other things. Stack allocated resource
//should have been cleaned up by stack unwinding
//on leaving the inner scope.
}
Я не хочу, тем более, чтобы вызвать дебаты, язык которых лучше и тому подобное, но я задаюсь вопросом, в какой степени можно сравнить эти реализации, и как надежные все они в случаях где блок, использующий ресурс, сталкивается с исключительными обстоятельствами. Я, возможно, полностью упустил точку в чем-то, и я никогда не был уверен в лучших методах удаления - ради аргумента, возможно, стоит предположить, что все функции уничтожения/уничтожения здесь идемпотентны - и действительно хорошие советы по этим вопросам могут также иметь отношение к этому вопросу.
Спасибо за любые указатели.
Да, это эквивалент шаблона, потому что «ресурс» будет уничтожен в конце его охватывающей области. – dasblinkenlight
Нет, это не эквивалент шаблона. –