【问题标题】:C++ proper structure initializationC++ 正确的结构初始化
【发布时间】:2019-02-20 17:54:00
【问题描述】:

我很抱歉再问一个新手问题,但谷歌无法帮助我(或者我只是不明白)。

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

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 的正确方法是什么/em>。

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

【问题讨论】:

  • 我认为更好的问题是向量类是复制对象还是为其分配指针。如果是动态复制,那就不用担心了。
  • 对我来说看起来不错。在您的情况下,由于您的 connectionElement 仅包含一个字符串(管理自己的内存)和一个 SOCKET(整数),因此您无需担心。
  • @selbie 那么在这种情况下,实际上是否有我必须使用 new 初始化的数据类型?我怎么知道哪些要求我这样做?
  • 这并没有解决问题,但是connectionElement 应该有一个接受 ip 和 soc 的构造函数。这样,addConnection 就变成了connectionElement newElement(ip, soc); connections.push_back(newConnection);。甚至connections.push_back(connectionElement(ip, soc));.

标签: c++ memory-management dynamic-memory-allocation


【解决方案1】:

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

不,在您的 sn-p 中,类 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 分配对象并且没有将返回的原始指针传递给负责删除它的某个智能指针,那么您确实必须使用delete 手动清理它。但是不应该有太多的情况适用于此,因为std::shared_ptrstd::unique_ptr 可以进行救援,并且它们附带std::make_sharedstd::make_unique,这甚至使得手动调用@987654331 已经过时了@运算符。

关于这个 sn-p 的最后一点说明

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

您可以将其简化为

connections.push_back({ip, soc});

这可能会节省复制构造(如果尚未被编译器优化)。

【讨论】:

    【解决方案2】:

    您的代码有效!

    vector.push_back()
    

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

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多