0

ユーザーがクラスのインスタンスを動的に割り当てられた配列に追加できる関数 addClass を持つ、作成したクラスを使用しています。

クラスのコードと簡単なテストを次に示します。

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->addClass(objectB) 命令を通過しないことです。デバッグを試みたところ、addClass() メソッドの代入命令に問題があることがわかりました。私も memcpy を試しましたが、うまくいきませんでした。誰かがこれに対する解決策を持っていますか。ありがとう。

4

3 に答える 3

3

C++ オブジェクトでは malloc を使用せず、new と new[]、delete と delete[] を使用してください。C++ の malloc の問題は、それがオブジェクトのコンストラクタを呼び出さず、free がデストラクタを呼び出さないことです。new、new[]、delete、delete[] を行います。構築されていないオブジェクトに割り当てているためにクラッシュが発生し、new を使用しなかったためにクラッシュが発生します。

それがあなたのコードの唯一の問題だと言っているわけではありませんが、それは明らかな問題です。

于 2013-09-28T22:08:15.087 に答える
2

new基本的な解決策は、 anddeleteよりもmallocandを優先することfreeです。std::vectorはるかに優れた解決策は、要素を に保持するなどの標準コンテナを使用することClass::addClass()です。コンピューターにすべてのメモリ管理を任せてください。開発とデバッグの時間を大幅に節約できます。

于 2013-09-28T22:07:51.243 に答える
1

Class(const Class&)コードでは、クラスのカスタム コピー コンストラクターを定義しましたが、コピー代入演算子を定義していないようです。コードでは、コピー代入 ( ) を使用してクラスのコピーを作成していますが、それを適切に実装していないことに注意してください。 Class& operator=(const Class&)operator=

さらに、C++ では、C の/よりも / を使用することをお勧めします。さらに、配列にはコンテナーを使用するnew[]ことをお勧めします。delete[]malloc()free()std::vector

std::vector< SomeSmartPointer >(例: std::vector<std::shared_ptr<SomeClass>>、または)を使用することもできますstd::vector<std::unique_ptr<SomeClass>>。一般に、std::vectorいくつかのスマート ポインターstd::vectorを検討しますが、生のポインターを所有する( )は使用しないでくださいstd::vector<SomeClass*>

于 2013-09-28T22:23:09.547 に答える