gpt4 book ai didi

c++复制bitset数组

转载 作者:行者123 更新时间:2023-12-02 10:38:54 26 4
gpt4 key购买 nike

我想使用比这个例子大得多的 2 个大型位集,所以我必须使用 malloc 来创建它们。
我操作第一个数组“foo”来创建一个"template"数组,然后将其复制到第二个“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 个单独的数组。

我假设发生的情况是复制后两个指针都指向内存中的同一个数组,我怎样才能避免这种情况,以便我可以保存"template"数组以供以后使用?

最佳答案

仅使用类接口(interface)。我建议您避免使用 new/delete/malloc/free。至于当你对一个你无法控制的复杂对象的内部数据进行 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

关于c++复制bitset数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54506773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com