c ++在没有矢量的情况下实时分配内存

时间:2014-08-15 00:30:50

标签: c++ arrays sockets pointers vector

再次询问堆栈。我有一个阵列,我希望始终保持最小尺寸,因为我必须通过互联网发送。问题是,在操作完成之前,程序无法知道最小大小。这导致我不得不采取方法:使用向量,或者创建程序可能需要的最大长度的数组,然后知道最小大小,用new初始化指针并将数据放在那里。但是我不能使用向量,因为它们需要发送序列化,并且向量和序列化都有我不想要的开销。例如:

unsigned short data[1270], // the maximum size the operation could take is 1270 shorts
*packet; // pointer
int counter; //this is to count how big "packet" will be
//example of operation, wich of course is different from my program
// in this case the operation takes 6 bytes
while(true) {
  for (int i; i != 6; i++) {
     counter++; 
     data[i]= 1;
  }
  packet=new unsigned short[counter];
  for (int i; i!=counter; i++) {
    packet[i]=data[i];
  }
}

就像你可能已经注意到的那样,这段代码是循环运行的,所以问题可能是我反复重新初始化同一指针的方法。 如果我这样做,这段代码中的问题是:

std::cout<<counter<<" "<<sizeof(packet)/sizeof(unsigned short)<<" ";

计数器的大小变化(通常从1到35),但数据包的大小始终为2.我在delete []之前尝试了new,但它没有解决问题。

这个问题也可能与代码的另一部分有关,但我在这里只是问:

我的方式是重复分配内存吗?

3 个答案:

答案 0 :(得分:1)

请求的情况下,不断添加到std::vector堆内存中分配的大小不超过实际需要的数量:

std::vector<int> vec;
std::size_t const maxSize = 10;
for (std::size_t i; i != maxSize; ++i)
{
  vec.reserve(vec.size() + 1u);
  vec.push_back(1234); // whatever you're adding
}

我应该补充说,我认为在正常情况下这样做是没有充分理由的。这个“计划”的表现可能会受到严重阻碍,没有明显的好处。

答案 1 :(得分:0)

您始终可以使用指针和realloc。 C ++是一种强大的语言,因为它的指针,你不需要使用数组。

查看cplusplus entry on realloc

对于您的情况,您可以像这样使用它:

new_packet = (unsigned short*) realloc (packet, new_size * sizeof(unsigned short));

if (new_packet!=NULL) {
   packet = new_packet;
   for(int i ; i < new_size ; i++)
       packet[i] = new_values[i];
}
else {
   if( packet != NULL )
       free (packet);
   puts ("Error (re)allocating memory");
   exit (1);
}

答案 2 :(得分:0)

好的,我在这里看到了你的逻辑中的一些问题。让我们从主要的一个开始:为什么你需要在data中分配一个全新的数组,其副本只是为了通过套接字发送它?它不像发送一个字母,send()将传输信息的副本,而不是通过网络移动它。这样做非常好:

send(socket, data, counter * sizeof(unsigned short), 0);

有。你不需要任何新的指针。

另外,我不知道你从哪里得到序列化的东西。向量基本上是自动调整大小的数组,一旦函数完成,它们也会从内存中删除它们。你可以这样做:

std::vector<unsigned short> packet;
packet.reserve(counter);
for (std::size_t i = 0; i < counter; ++i)
    packet[i] = data[i];

send(socket, &packet[0], packet.size() * sizeof(unsigned short), 0);

甚至缩短为:

std::vector<unsigned short> packet;
for (std::size_t i = 0; i < counter; ++i)
    packet.push_back(data[i]);

但是使用此选项,向量将调整counter次的大小,这是性能消耗的。如果您有可用信息,请务必先设置尺寸。