2017-08-27 37 views
-2

我无法让我的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; 
} 
+5

有什么错误讯息? – pmaxim98

+0

使用[GCC](http://gcc.gnu.org/)...)编译所有警告和调试信息(例如'g ++ -Wall -Wextra -g')。然后**使用调试器**(和[valgrind](http://valgrind.org/)...)。使用[智能指针](http://en.cppreference.com/w/cpp/memory)和[std :: string](http://en.cppreference.com/w/cpp/string/basic_string)。 –

+0

所以你说它之前工作正常,但现在突然发生故障 你有权限访问类的内容或执行它? – ahmednawazbutt

回答

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

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

所以你的名字成员已拨出100个字符数组准确。

您稍后再向此阵列写入更多内容。结果你的堆被破坏了。

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