表达式:_CrtlsValidHeapPointer(pUserData)错误

时间:2014-03-24 21:18:44

标签: c++ oop pointers malloc memcpy

我试图在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;
}

提前致谢。

2 个答案:

答案 0 :(得分:1)

首先:

buffer = (FirstClassObject*) malloc(5)

这会分配一个大小为5的缓冲区,而不是5个FirstClassObject。为此,您需要执行以下操作:

buffer = (FirstClassObject*) malloc(5*sizeof(FirstClassObject));

第二

memcpy(buffer,&object,1);

这只复制了对象结构中的1个字节。不是一个完整的对象。在这里,sizeof也是你的朋友,虽然它很危险,因为接收缓冲区不是一个完全构造的对象。

然后这一行:

next_object.buffer = object.next;

会成员到成员副本(提供它,因为你试图将对象影响到指针)有效地写入传递你先前欠分配的缓冲区的边界给你断言。

答案 1 :(得分:1)

首先,这是错误的:

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 ++混合(没有适当的经验),你最终会遇到诸如你的例子之类的问题。