我自己的应用程序使C ++出现故障

时间:2017-08-27 08:23:50

标签: c++

我无法让我的c ++应用程序正常工作,我会在这里粘贴我的简单内存类和测试应用程序。

现在我在控制台中运行时遇到访问冲突并且没有输出。我使用Visual Studio 2015。

我似乎对我的汽车课程存在问题,不确定会出现什么问题。如果我尝试调试,我会发现一些错误消息。我不知道如何解决它......

#define WIN32_LEAN_AND_MEAN

enum memtype {typechar = 1, typeint};

class Mem
{

    public:
        Mem(int size);

        void * alloc(memtype t);

        void * ptr();

        void release();

        ~Mem();

    private:
        int sizebytes;
        void * p;
};

#include <new.h>
#include "Mem.h"

Mem::Mem(int size)
{
    sizebytes = size;
}

void * Mem::alloc(memtype t)
{
    if (t==typechar)
    {
        p = (char *)new char(sizebytes);
        return p;
    }
}

void * Mem::ptr()
{
    return p;
}

void Mem::release()
{
    if(p)
        delete p;
}

Mem::~Mem()
{
    if(p)
        delete p;
}

#include "Mem.h"
#include <stdio.h>

int check(void * p)
{
    int retval = 0;
    if (p == NULL)
    {
        printf("Memory Fail: NULL pointer...\n");
        retval = 0;
    }
    else
        retval = 1;

    return retval;
}

class Car
{
public:
    Car::Car()
    {
        Car::name = 0;
        Car::brand = 0;
        Car::type = 0;
    }

    int Car::alloc(char *inname, char *inbrand, char *intype)
    {
        Car::name = new Mem(sizeof(*inname));
        if (!check(Car::name->alloc(typechar)))
            return 0;
        printf("%s", sizeof(*inname));

        Car::brand = new Mem(sizeof(*inbrand));
        if (!check(Car::brand->alloc(typechar)))
            return 0;
        printf("%s", sizeof(*inbrand));

        Car::type = new Mem(sizeof(*intype));
        if (!check(Car::type->alloc(typechar)))
            return 0;
        printf("%s", sizeof(*intype));
        /*sprintf?*/
        sprintf_s((char *)Car::name->ptr(), sizeof(*inname), "%s", inname);
        sprintf_s((char *)Car::brand->ptr(), sizeof(*inbrand), "%s", inbrand);
        sprintf_s((char *)Car::type->ptr(), sizeof(*intype), "%s", intype);

        return 1;
    }
    char * Car::getName()
    {
        if(Car::name!=0)
            return (char *)Car::name->ptr();
    }
    char * Car::getBrand()
    {
        if(Car::brand!=0)
            return (char *)Car::brand->ptr();
    }
    char * Car::getType()
    {
        if(Car::type!=0)
            return (char *)Car::type->ptr();
    }

    Car::~Car()
    {
        if (Car::name != 0)
            delete Car::name;
        if (Car::brand != 0)
            delete Car::brand;
        if (Car::type != 0)
            delete Car::type;
    }
private:
    Mem *name, *brand, *type;
};

void store()
{

}

int main()
{
    Mem cartype1(sizeof("Sedan"));
    cartype1.alloc(typechar);
    check(cartype1.ptr());

    Mem cartype2(sizeof("Van"));
    cartype2.alloc(typechar);
    check(cartype2.ptr());

    Mem cartype3(sizeof("Pickup"));
    cartype3.alloc(typechar);
    check(cartype3.ptr());

    sprintf((char *)cartype1.ptr(), "%s", "Sedan");
    sprintf((char *)cartype2.ptr(), "%s", "Van");
    sprintf((char *)cartype3.ptr(), "%s", "Pickup");

    Mem carname(sizeof("Supah Car"));
    carname.alloc(typechar);
    check(carname.ptr());

    Mem carbrand(sizeof("Supah"));
    carbrand.alloc(typechar);
    check(carbrand.ptr());

    sprintf((char *)carname.ptr(), "%s", "Supah Car");
    sprintf((char *)carbrand.ptr(), "%s", "Supah");

    Car test;

    test.alloc((char *)carname.ptr(), (char *)carbrand.ptr(), (char *)cartype1.ptr());


    printf("%s is of brand %s and type %s\n", test.getName(), test.getBrand(), test.getType());



    char * nullptrtest = NULL;
    printf_s("%d", &test);

    printf_s("sizeof int %d\n", sizeof(int));

    printf_s("Test %s\n", carname.ptr());

    return 1;
}

1 个答案:

答案 0 :(得分:1)

int Car::alloc(char *inname, char *inbrand, char *intype)
{
    Car::name = new Mem(sizeof(*inname));

sizeof * inname会给你sizeof(char)== 1

所以你的名字成员已经完全分配了1个字符的数组。

您稍后会更多地写入此数组。结果你的堆已损坏。

我不知道你为什么要使用模拟内存分配而不是使用std :: string - 但是你需要至少分配strlen(inname)+1个字节来存储inname