C ++正确的结构初始化

问题描述 投票:6回答:2

我很抱歉问另一个新手问题,但谷歌不能帮助我(或者我可能只是不理解它)。

我正在尝试编写一个能够存储一些简单连接数据的类。我的早期概念如下所示:

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人,并且不知道shi *关于内存分配,我想知道在addConnection()中初始化新connectionElement的正确方法是什么。

我是否必须使用new来防止数据被删除,或者编译器是否假设以后可能再次访问存储的结构?如果我使用new运算符,我必须在线程终止之前手动删除所有对象,还是自动执行?

c++ memory-management dynamic-memory-allocation
2个回答
3
投票

我是否必须使用new来防止数据被删除,或者编译器是否假设以后可能再次访问存储的结构?

不,在你的片段中,类ConnectionData拥有其数据成员connections,并且向量中的元素按值存储。因此,只要其拥有的类实例存在,connections就是existant:

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分配对象并且没有将返回的原始指针传递给某个智能指针来处理它的删除,你必须用delete手动清理它。但是应该没有太多适用的情况,因为std::shared_ptrstd::unique_ptr在那里进行救援,并且它们与std::make_sharedstd::make_unique一起发货,这甚至使得手动调用new操作员已经过时了。

关于此片段的最后一点说明

connectionElement newElement;
newElement.ip = ip;
newElement.soc = soc;
connections.push_back(newElement);

你可以简化这个

connections.push_back({ip, soc});

这可能会保存复制结构(如果编译器尚未优化)。


1
投票

你的代码有效!

vector.push_back()

复制对象,因此整个结构的副本将存在于连接向量中。

© www.soinside.com 2019 - 2024. All rights reserved.