繁体   English   中英

C ++复制位集数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM