【发布时间】:2014-08-15 00:30:50
【问题描述】:
再次询问堆栈。我有一个数组,我希望始终保持最小大小,因为我必须通过互联网发送。问题是,在操作完成之前,程序无法知道最小大小是多少。这导致我不得不采取一些方法:使用向量,或者制作程序可能需要的最大长度的数组,然后它知道最小大小,用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)<<" ";
counter大小不一(一般从1到35),但是packet的大小总是2。我在new之前也试过delete [],但是没有解决问题。
这个问题也可能与代码的另一部分有关,但我只是在问:
我重复分配内存的方式对吗?
【问题讨论】:
-
如果你想记录/存储/等。大小,使用
std::size_t。 -
为什么不只使用最大大小的数据缓冲区,只发送一部分呢?
-
我的意思是当你使用套接字发送方法时。您不必指定缓冲区的大小。您可以指定要发送的包含在该缓冲区中的数据的大小。
-
vector只是new[]的包装器,IDK 应该是“向量需要序列化才能发送”的意思。向量没有任何开销,除非您考虑将size和capacity都存储为开销 -
大量内存泄漏。每个
new都必须有一个delete。如果你一直分配内存并且从不释放它,你最终会使用它。
标签: c++ arrays sockets pointers vector