【问题标题】:Get size of dynamic pointer in C++在 C++ 中获取动态指针的大小
【发布时间】:2012-05-22 09:29:57
【问题描述】:

我想用 C++ 写一个指向文件的动态指针。

这是我在头文件中的声明:

byte* buffer;

然后在 Cpp 文件中,我分配了它:

buffer = new byte[1000];

但在动态分配中大小将大于 1000。

然后我写入文件:

ofstream myfile;

myfile.open("test.txt", ios::binary);
myfile.write((char*)buffer, 1000);  
myfile.close();

如果我将缓冲区的长度指定为 1000,那么 1000 之后的其余字节将被丢弃。如果我使用: sizeof(buffer) 那么它只写了 1 个字节。

如何获取缓冲区的动态大小?

【问题讨论】:

  • 那不是 C++ style,一般来说不可能从指向数组元素的指针中获取数组的大小。
  • 全局变量,new[]MAGIC_BUFFER_SIZE 不需要强制转换?
  • @sehe 那么我怎样才能更好地实现它>
  • @olidev:这就是你的代码有一个没有明显含义或派生的数字的地方。当你说“1000”时,为什么是 1000?为什么不是1001?你是怎么得出这个数字的?这是什么意思?如果我将其更改为 1001 会破坏什么?

标签: c++


【解决方案1】:

简单:

std::vector<byte> buffer;
buffer.resize(1000);
myfile.write(&buffer[0], buffer.size());

【讨论】:

  • 如果提问者的代码中需要转换为char*,那么您的代码中也需要:byte 可能是unsigned char
  • 为什么不std::vector&lt;byte&gt; buffer(1000);
  • @Nawaz:我对问题的阅读表明buffer 的定义和大小发生在不同的地方。如果你能把它们结合起来,你确实应该。
  • 也许我们应该有一个 C++ 常见问题解答问题,“我应该只使用一个奇怪的向量吗?”,我们可以把这些问题骗到 :-) 然后有人可以回答它“不,使用 deque "。
  • 但是当缓冲区的大小大于 1000 时,通过引用传递。当我调用它 buffer.size() 时,我仍然得到 1000
【解决方案2】:

缓冲区的大小是1000。确实,当您使用“new”时,它有时可以分配更多内存,但这样做是为了固定下一个“new”。因此,在 1000 个第一个字节之后分配的所有其他内存可能并且可能会在未来的“新”中使用。
底线你不能并且应该假设你有超过 1000 个字节。

【讨论】:

  • However the size will be bigger than 1000 in dynamic allocation.
  • A.它may 更大。 B. 我想不出你愿意这样做的任何理由。 C. 即使有可能你只会有垃圾。
  • 我认为你没有抓住重点。 '1000' 只是一个示例,实际代码将获得一个指向动态分配数组的 char*,这是我的解释。是的,问题的措辞很糟糕
  • 我可能没抓住重点。假设他要求 1000,但 new 实际上从操作系统请求 4096 字节。他想用它做什么?内存管理可以将剩余的 3096 字节提供给它希望的人。
  • 重点是,new byte[1000] 不在他的代码中,它在调用者的某个地方,并且大小未知。提示 byte 闻起来有 Java/C# 的味道,你可以在那里例如就说buffer.Length
猜你喜欢
  • 1970-01-01
  • 2012-01-20
  • 2021-07-23
  • 1970-01-01
  • 2012-06-17
  • 2015-05-03
相关资源
最近更新 更多