[英]c++ copy bitset array
我想使用2个比本示例大得多的大位集,因此必须使用malloc来创建它们。 我操纵第一个数组“ foo”以创建“模板”数组,然后将其复制到第二个“ bar”,然后我想继续操纵并在程序中使用第二个数组,完成后我希望能够再次快速将模板“ foo”复制到“ bar”,因此我可以从这一点重新开始。
#include <bitset>
#include <iostream>
using namespace std;
int main ()
{
long i;
const long size=1000;
bitset<size>* foo;
foo = (bitset<size>*) malloc (sizeof(bitset<size>));
foo->set();
for(i=3;i<1000;i=i+3) { foo->reset(i); }
bitset<size>* bar;
bar = (bitset<size>*) malloc (sizeof(bitset<size>));
bar->set();
std::cout << foo->count() << " " << bar->count() << '\n';
memcpy( &bar, &foo, sizeof(foo) );
std::cout << foo->count() << " " << bar->count() << '\n';
bar->reset(1); bar->reset(2);
std::cout << foo->count() << " " << bar->count() << '\n';
return 0;
}
输出:
667 1000
667 667
665 665
memcpy行有效,但是当我随后在“ bar”位集中进行更改时,它也会更改“ foo”。 除了memcpy,我还可以做:bar = foo; 但是当bar改变时,foo也再次改变。 从第一个cout行可以看到,内存中有2个独立的数组,计数不同。
我假设发生的情况是复制后两个指针都指向内存中的同一数组,如何避免这种情况,以便保存“模板”数组以备后用?
仅使用类接口。 我建议您避免new / delete / malloc / free。 至于当您处理不受控制的复杂对象的内部数据时发生的一切,几乎可以肯定会导致“未定义的行为”。 您正在覆盖该类内部的所有内容,但幸运的是,这次您没有崩溃。 看起来就像在您的特定编译器上,您只是覆盖了一些内存地址,因此一个最终指向另一个的数据区。 我希望它在稍后尝试清理时崩溃(尽管从技术上讲可能会发生任何事情)。
这是您的代码的一个较小的更正:
#include <bitset>
#include <iostream>
using namespace std;
int main()
{
long i;
const long size = 1000;
bitset<size> foo;
foo.set();
for (i = 3; i < 1000; i = i + 3) { foo.reset(i); }
bitset<size> bar;
bar.set();
std::cout << foo.count() << " " << bar.count() << '\n';
bar = foo;
std::cout << foo.count() << " " << bar.count() << '\n';
bar.reset(1); bar.reset(2);
std::cout << foo.count() << " " << bar.count() << '\n';
return 0;
}
667 1000
667667
667665
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.