将对象指针复制到动态对象数组中

时间:2013-09-28 22:01:15

标签: c++ arrays pointers malloc

我正在创建一个我创建的类,它有一个addClass函数,允许用户将A Instance of Class添加到一个动态分配的数组中。

以下是该类的代码和一个简单的测试:

Class.h列表

#ifndef CLASS_H
#define CLASS_H

#include<iostream>

class Class {
public:
    Class(std::string text);
    Class(const Class& orig);
    virtual ~Class();
    Class(std::string text, Class * name, int size);
    std::string toString();
    void addClass(Class * name, int size = 1);
    Class getClass(int index);
private:
    Class * classArray;
    std::string value;
    int size;

};

#endif  /* CLASS_H */

Class.c列表

#include "Class.h"
#include <cstdlib>


Class::Class(std::string text) {
    classArray = NULL;
    value = text;
    size = 0;
}

Class::Class(const Class& orig) {/*...*/}

Class::~Class() {}

Class::Class(std::string text, Class * name, int size){
    value = text;
    this->size = size;
    if(size == 1)
        classArray = name;
    else{
        int i;
        classArray = (Class*)malloc(size*sizeof(Class));
        for(i = 0; i < size; i++){
            classArray[i] = name[i];
        }
    }
}

std::string Class::toString(){
    return value;
}

void Class::addClass(Class * name, int size){
    int i;
    Class * tmp = (Class*)malloc((this->size+size)*sizeof(Class));
    for(i = 0; i < this->size-1; i++){
        tmp[i] = classArray[i];
    }
    if(size == 1)
        tmp[size-1] = name[0];//assignement method is the problem!!!??
    else{
        for(i = this->size; i < this->size+size-1; i++){
            tmp[i] = name[i];
        }
    }
    this->size += size;
    free(classArray);
    classArray = tmp;
}

Class Class::getClass(int index){
    return classArray[index];
}

test.c列表

#include<iostream>
#include "Class.h"

using namespace std;

int main(int argc, char** argv) {

    Class * objectA = new Class("objectA");
    Class * objectB = new Class("objectB");

    cout << objectA->toString() << endl;

    objectA->addClass(objectB);
    //never gets here :'(
    cout << objectA->toString() << endl;

    return 0;
}

问题是测试永远不会超过objectA-&gt; addClass(objectB)指令。我试图调试,我发现问题来自addClass()方法的assignement指令。我也试过memcpy它没用。有没有人有这方面的解决方案。感谢。

3 个答案:

答案 0 :(得分:3)

不要在C ++对象上使用malloc,使用new和new []以及删除和删除[]。 C ++中malloc的问题在于它不会为您的对象调用构造函数,而free则不会调用析构函数。 new,new [],delete和delete [] do。你得到了一个崩溃,因为你正在分配给未构造的对象而你得到了这个,因为你没有使用新的。

不是说这是你的代码唯一的问题,但它是显而易见的。

答案 1 :(得分:2)

基本解决方案是newdelete优先于mallocfree。更好的解决方案是使用标准容器(例如std::vector)将元素保存在Class::addClass()。让计算机负责所有内存管理;你将节省大量的开发和调试时间。

答案 2 :(得分:1)

请注意,在您的代码中,您为类定义了自定义复制构造函数Class(const Class&),但您似乎已定义复制赋值运算符 {{1 }}。请注意,在您的代码中,您使用副本分配(Class& operator=(const Class&))来创建类的副本,但是您没有正确实现它。

此外,在C ++中,您应该更喜欢将operator= / new[]用于C delete[] / malloc(),更好的方法是使用 free() < / strong>数组容器。

您还可以拥有std::vector(例如std::vector< SomeSmartPointer >std::vector<std::shared_ptr<SomeClass>>)。通常,请考虑某些智能指针std::vector<std::unique_ptr<SomeClass>>,但不要使用拥有原始指针的std::vectorstd::vector