如何在 "modern" C++ 中 create/destroy 对象?
How to create/destroy objects in "modern" C++?
我正在将 C# 应用程序移植到 C++ linux 应用程序。我对“现代”(C++11?)中的构造和破坏感到困惑。我一直认为你必须使用 new/delete
但现在看来 C++ 推荐的是不要这样做(这是正确的还是我读错了博客?)。
我大概有什么(B
和BRec
atm有6个子class:
class ARec : public BRec
class A : public B
. . .
class Factory
BRec GetRecord(WrapperStruct s)
{
if(s.Type == 'A')
{
A* a = (A*)s.Data;
auto rec = ARec((ushort)a->Num);
rec.OtherField = a.OtherField;
return rec;
}
. . .
main
// separate pthread
void* Logger(void* arg) {
int* thread_state = (int*)arg;
auto f = Factory();
WrapperStruct item;
while (true)
{
q->try_dequeue(item);
auto rec = f.GetRecord(item);
auto bytes = f.GetBytes(rec);
// write bytes to file ...
delete bytes;
if(*thread_state == -1)
pthread_exit(0);
}
问题 - 编译器如何知道何时删除工厂方法中的 s.Data
?相同 - rec
如果它是在 class 方法中创建然后交叉到其他方法(while
在 Logger 中)?有没有关于如何在 C++11 中管理变量内存的简单指南?
编辑: s.Data
包含对在第 3 方 dll 中创建的对象的引用,并且可以是不同的类型,因此 s.Type
场
智能指针是关键。
std::shared_ptr<Foo> foo = std::make_shared<Foo>();
std::unique_ptr<Foo> bar = std::make_unique<Foo>();
可以复制共享指针。他们做引用计数。当引用计数降为零时,它们会自动删除它们的内容。
无法复制唯一指针。它们可以通过引用复制。当唯一指针超出引用范围时,它会为您释放对象。
所以它现在的工作方式很像 Java。
void notAMemoryLeak() {
std::shared_ptr<Foo> foo = std::make_shared<Foo>();
}
除此之外,您将它们视为指针。此时它们使用的语法是相同的,除了你传递的是智能指针,而不是 Foo *.
void myFunct(std::unique_ptr<Foo> &foo) {
cout << "Foo: " << foo->getName() << "\n";
}
make_shared
和 make_unique
可以采用与任何 Foo 的构造函数相同的参数,因此请随意传递内容。
我再做一件事:
class Foo {
public:
typedef std::shared_ptr<Foo> Pointer;
...
};
Foo::Pointer foo = std::make_shared<Foo>();
有时我也会创建静态方法来让它更干净。这是风格上的,不是必需的。有些人可能会指责我。但它干净且易于阅读。
我正在将 C# 应用程序移植到 C++ linux 应用程序。我对“现代”(C++11?)中的构造和破坏感到困惑。我一直认为你必须使用 new/delete
但现在看来 C++ 推荐的是不要这样做(这是正确的还是我读错了博客?)。
我大概有什么(B
和BRec
atm有6个子class:
class ARec : public BRec
class A : public B
. . .
class Factory
BRec GetRecord(WrapperStruct s)
{
if(s.Type == 'A')
{
A* a = (A*)s.Data;
auto rec = ARec((ushort)a->Num);
rec.OtherField = a.OtherField;
return rec;
}
. . .
main
// separate pthread
void* Logger(void* arg) {
int* thread_state = (int*)arg;
auto f = Factory();
WrapperStruct item;
while (true)
{
q->try_dequeue(item);
auto rec = f.GetRecord(item);
auto bytes = f.GetBytes(rec);
// write bytes to file ...
delete bytes;
if(*thread_state == -1)
pthread_exit(0);
}
问题 - 编译器如何知道何时删除工厂方法中的 s.Data
?相同 - rec
如果它是在 class 方法中创建然后交叉到其他方法(while
在 Logger 中)?有没有关于如何在 C++11 中管理变量内存的简单指南?
编辑: s.Data
包含对在第 3 方 dll 中创建的对象的引用,并且可以是不同的类型,因此 s.Type
场
智能指针是关键。
std::shared_ptr<Foo> foo = std::make_shared<Foo>();
std::unique_ptr<Foo> bar = std::make_unique<Foo>();
可以复制共享指针。他们做引用计数。当引用计数降为零时,它们会自动删除它们的内容。
无法复制唯一指针。它们可以通过引用复制。当唯一指针超出引用范围时,它会为您释放对象。
所以它现在的工作方式很像 Java。
void notAMemoryLeak() {
std::shared_ptr<Foo> foo = std::make_shared<Foo>();
}
除此之外,您将它们视为指针。此时它们使用的语法是相同的,除了你传递的是智能指针,而不是 Foo *.
void myFunct(std::unique_ptr<Foo> &foo) {
cout << "Foo: " << foo->getName() << "\n";
}
make_shared
和 make_unique
可以采用与任何 Foo 的构造函数相同的参数,因此请随意传递内容。
我再做一件事:
class Foo {
public:
typedef std::shared_ptr<Foo> Pointer;
...
};
Foo::Pointer foo = std::make_shared<Foo>();
有时我也会创建静态方法来让它更干净。这是风格上的,不是必需的。有些人可能会指责我。但它干净且易于阅读。