很抱歉问另一个新手问题,但是Google不能完全帮助我(或者也许我只是听不懂)。
我正在尝试编写一个能够存储一些简单连接数据的类。我的早期概念如下所示:
struct connectionElement{
string ip;
SOCKET soc;
};
class ConnectionData{
private:
vector<connectionElement> connections;
public:
ConnectionData();
~ConnectionData();
void addConnection(string ip, SOCKET soc);
};
void ConnectionData::addConnection(string ip, SOCKET soc) {
connectionElement newElement;
newElement.ip = ip;
newElement.soc = soc;
connections.push_back(newElement);
return;
}
现在我已经读到,一旦代码到达范围的末尾,将不使用 new 进行初始化的对象将被释放。因此,由于我是一名Java专家,对内存分配并不了解,所以我想知道在 addConnection()<中初始化新的 connectionElement 的正确方法是什么? / em>。
是否必须使用 new 来防止数据被删除,或者编译器是否假定以后可以再次访问存储的结构?如果我使用 new 运算符,是否必须在线程终止之前手动删除所有对象,否则该操作会自动发生吗?
答案 0 :(得分:3)
我是否必须使用new来防止数据被删除,或者编译器是否假定以后可以再次访问存储的结构?
否,在您的代码段中,类ConnectionData
拥有其数据成员connections
,向量中的元素按值存储。因此,connections
存在,只要其拥有的类实例存在:
void someFunctionInYourProgram()
{
ConnectionData example{};
example.addConection(/* ... */);
// do stuff with the ConnectionData instance and its connections
void doMoreStuffWith(example);
} // Now, example went out of scope, everything is automatically cleaned up.
如果我使用new运算符,是否必须在线程终止之前手动删除所有对象,或者这会自动发生?
如果您用new
分配对象,并且没有将返回的原始指针传递给负责处理它的删除的智能poiter,则实际上必须使用delete
手动清理它。但是应该不会有太多情况适用,因为std::shared_ptr
和std::unique_ptr
随时可以解救,它们附带std::make_shared
和std::make_unique
,甚至可以手动调用new
运算符已经过时。
关于此摘要的最后一个提示
connectionElement newElement;
newElement.ip = ip;
newElement.soc = soc;
connections.push_back(newElement);
您可以将其简化为
connections.push_back({ip, soc});
这可能会保存副本结构(如果编译器尚未对其进行优化)。
答案 1 :(得分:1)
您的代码有效!
vector.push_back()
复制对象,因此连接向量中将存在整个结构的副本。