破坏对象数组

时间:2012-09-29 04:38:27

标签: c++ arrays

所以说我有

foo* fooObject1 = new foo[10];
// here would go code for initializing fooObject1[0] to fooObject1[9] with a foo object for each.
foo* fooObject2 = new foo[30];

for(int = 0; i < 10; i++)
fooObject2[i] = fooObject1[i];

if(fooObject1 != NULL)
delete[] fooObject1; //this "destroys" the array, BUT ALSO calls the destructors of all the foo objects inside fooObject1, causing fooObject2 elements to be anything but what it was before.

fooObject1 = fooObject2;

其中foo是我用其各自的方法创建的特定对象。

然而,我的问题是,我想破坏fooObject1指向的数组,但不是数组的元素,有没有办法在C ++中完成?我知道绕过这个问题的另一种方法是重载=(等于)运算符,但是在程序中我需要它,编写包括为许多其他类重载许多其他=运算符,这使得它是一个单调乏味的长过程。 我希望以某种方式我可以将对象保存在fooObject2中,但是除去fooObject1指向的数组。那可以这样做吗?怎么样?如果不是如何,那么有没有网站可以重定向我阅读它?

4 个答案:

答案 0 :(得分:2)

数组指向fooObject1 包含对象。你实际上是在请求木匠摧毁一个书柜,但要把书架放在书架上。 (如果你能做到,那就很好了。)

在for循环中,然后将对象从fooObject1复制到fooObject2。所以fooObject2中有不同的对象。

如果您希望对象独立于其容器,则应使用指针。

答案 1 :(得分:2)

这些独立的。您的fooObject2数组已经像fooObject1一样被分配,并且在整个过程中为每个数组分配了赋值运算符。你有效地从fooObject2中的fooObject1获得每个对象的副本。

你不能放弃fooObject1。您需要删除[]它或者您将泄漏内存。 fooObject2,如所写的,是独立的,除非你在fooObject类中有内部指针,并且由于你没有遵循Rule of Three而执行了浅拷贝。

最后一行将fooObject1(指针)设置为在清理fooObject1并删除其先前的内存分配(仅仅是FYI)后指向与fooObject2相同的对象,但在引用之后不要删除它们;只删除一个。

答案 2 :(得分:1)

在C ++中,数组不是对象。你所拥有的是两个指针,因为你调用了new[],恰好指向了n个连续分配的对象的开头。您无法删除数组而不删除对象。数组“是”对象所在的连续内存。

但是,您可以清除指针,但这样做意味着您不再知道对象的位置。这就是所谓的内存泄漏。那些内存是为这些对象分配的,你不能再释放它,因为你不知道它在哪里。

您确实将10个对象的值从fooObject1复制到fooObject2。删除fooObject1不会更改fooObject2中的对象,因为它们是不同的对象 - fooObject2指向具有不同对象集的不同内存位置中的不同数组。您通过将这些对象的值分配给fooObject1中对象的值来保留以前为fooObject2的值。

答案 3 :(得分:1)

您可能希望使用现代C ++ 技术和容器,例如std::vector(而不是原始异常 - 不安全漏洞 new[]和{ {1}}和原始指针)。

如果您希望 指针数组 delete[]个对象,并且您希望在这些数组之间共享这些foo个对象,那么您可以考虑foo

vector<shared_ptr<foo>>是一个智能指针模板类,它使用引用计数,并且仅在释放对象的 last 引用时销毁指向对象。

您可以使用shared_ptr分配器来实例化make_shared的新实例,并使用foo将它们放入(动态)数组中。

e.g。

vector::push_back()

请注意,使用现代 C ++技术:没有显式 #include <vector> // std::vector #include <memory> // std::shared_ptr, std::make_shared using namespace std; // Smart pointer to foo typedef shared_ptr<foo> foo_ptr; // Dynamic arrays of smart pointers typedef vector<foo_ptr> foo_array; // Define an array of smart pointers to foo foo_array v1; // Populate the array v1.push_back( make_shared<foo>( /* some constructor init params */ ) ); v1.push_back( make_shared<foo>( /* ... */ ) ); // Create another array of smart pointers to foo's // and reference the foo's created in v1 foo_array v2 = v1; // Empty the array of smart pointers 'v1'. // However, the 'foo' objects previously created are still "alive", // because of the references stored in 'v2'. v1.clear(); ;由于STL容器,智能指针和C ++析构函数的强大功能,资源可以自动自动管理;代码是无泄漏的,异常安全,易于阅读和维护。