C ++复制位集阵列

问题描述 投票:0回答:1

我想用2个大位集比这个例子要大很多,所以我必须使用malloc来创建它们。我操纵第一阵列“富”创建一个“模板”数组,然后将其复制到第二个“栏”,然后我想继续操作,并在我的程序中使用的第2个数组,当我做我希望能够复制的模板“富”到“栏中的”再快点,所以我可以从该点开始。

#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工作,但是当我做,然后在“酒吧”的变化比特集也改变为“foo”。取而代之的是的memcpy的我也可以只是做:巴= FOO;但同样foo是变更后的BAR变化时。存储器中有2个独立的数组作为可以从第一COUT线,其中计数不同可以看出。

我认为发生的事情是两个指针指向复制后在同一阵列中的记忆,我怎样才能避免这种情况,所以我可以拯救“模板”阵列后使用?

c++ arrays bitset
1个回答
0
投票

只能使用类接口。我会建议你避免新/删除/的malloc /免费。对于无论是在一个复杂的对象,你不控制的内部数据上,当你的memcpy去,那几乎可以肯定是导致“未定义的行为”。您将要覆盖无论发生什么事是内部的那类,幸好你没出事这段时间。它看起来像你的具体的编译器,你只是简单地覆盖一些内存地址,所以一结束,在其他的数据区域指向。我希望它以后崩溃时它会尝试清理(虽然技术上任何事情都可能发生)。

这里是你的代码的小幅调整:

#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 667 667 667 665

© www.soinside.com 2019 - 2024. All rights reserved.