我正在尝试学习C ++中的指针和一流对象。我确定问题在我的指针分配或调用中。我想知道是否有人可以帮助我更好地理解指针以及使用静态变量/方法。

FirstClass.h

#pragma once

class FirstClassObject {

public: FirstClassObject();
    FirstClassObject(int);
    FirstClassObject(int, FirstClassObject);
    static void next_attr();
    static int attribute;
    int num;
    FirstClassObject *buffer;
    FirstClassObject *next;

    ~FirstClassObject();
};


FirstClassObject.cpp

#include "FirstClass.h"
#include <stdlib.h>
#include <string>

using namespace std;

FirstClassObject::FirstClassObject(){
num = attribute;
next_attr();
};

FirstClassObject::FirstClassObject(int attr){
    num = attr;
    next_attr();
}

FirstClassObject::FirstClassObject(int attr, FirstClassObject object){
    num = attr;
    next_attr();
    buffer = (FirstClassObject*) malloc(5);
    memcpy(buffer,&object,1);
    next = buffer;
}

void FirstClassObject::next_attr(){
    attribute++;
}

FirstClassObject::~FirstClassObject(){
    free(buffer);
    free(next);
}


FirstClassObject_test.cpp

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

using namespace std;

int FirstClassObject::attribute = 0;

FirstClassObject get_next_object(FirstClassObject object){
    FirstClassObject next_object;
    next_object.buffer = object.next;
    return next_object;
}

int main(){

    FirstClassObject object;
    FirstClassObject otherobject(4, object);

    cout << get_next_object(otherobject).num << "these numbers should be the same " << object.num << '\n';

    return 0;
}


提前致谢。

最佳答案

首先,这是错误的:

buffer = (FirstClassObject*) malloc(5);
memcpy(buffer,&object,1);


malloc()与new []不同。

您的FirstClassObject类型是非POD类型,因为它具有非平凡的析构函数。这意味着您不能使用malloc()正确构造它。 malloc()所做的只是分配内存,仅此而已。您实际上需要构造一个FirstClassObject对象,并使用new[ ]动态地进行操作。

其次,malloc()需要分配的字节数。什么是sizeof(FirstClassObject)?我敢打赌它不是5(您给malloc()的参数)。但是要点是,即使给了malloc()正确的字节数,也无法通过使用它正确地构造对象。

第三,由于FirstClassObject不是POD,因此memcpy()的用法也不好。简而言之,memcpy()不会复制对象。要复制对象,请调用复制构造函数。

您似乎正在阅读C语言书籍和/或阅读C语言资源,而不是C ++书籍和资源。如果您愿意,请放下C语言,然后从适当的来源学习C ++。如果您尝试将C与C ++混合使用(没有适当的经验),则会遇到诸如示例之类的问题。

关于c++ - 表达式:_CrtlsValidHeapPointer(pUserData)错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22620790/

10-13 09:08