我想用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线,其中计数不同可以看出。
我认为发生的事情是两个指针指向复制后在同一阵列中的记忆,我怎样才能避免这种情况,所以我可以拯救“模板”阵列后使用?
只能使用类接口。我会建议你避免新/删除/的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