C++ 结构的memcpy操作中的分段错误

C++ 结构的memcpy操作中的分段错误,c++,C++,我正在添加头文件和cpp文件(它有主功能) 拍卖价格 #如果没有拍卖价格# #定义拍卖价格 /* * *类拍卖价格-维护购买订单、销售订单簿 */ #包括 #包括 //#布拉格语包(1) 结构顺序 { char*itemId; char*auctionId; 内侧; }; 类别拍卖价格 { 公众: 虚拟整数AddNewOrder(char*itemId,char*auctionId,int-Side,int-Price)=0; 虚拟整数DeleteOrder(char*itemId,char*a

我正在添加头文件和cpp文件(它有主功能)

拍卖价格
#如果没有拍卖价格#
#定义拍卖价格
/*
*
*类拍卖价格-维护购买订单、销售订单簿
*/
#包括
#包括
//#布拉格语包(1)
结构顺序
{
char*itemId;
char*auctionId;
内侧;
};
类别拍卖价格
{
公众:
虚拟整数AddNewOrder(char*itemId,char*auctionId,int-Side,int-Price)=0;
虚拟整数DeleteOrder(char*itemId,char*auctionId)=0;
虚拟int Print()=0;
};
类别拍卖价格\u Imp:公开拍卖价格
{
公众:
拍卖价格_Imp();
~AuctionPrice_Imp();
std::map>BuyMap;
std::map>SellMap;
int AddNewOrder(char*itemId,char*auctionId,int-Side,int-Price);
int DeleteOrder(char*itemId,char*auctionId);
int Print();
};
#恩迪夫
拍卖价格
/**
*拍卖价格类的实现
*构造函数、AddNewOrder、DeleteOrder、打印
*
*/
#包括
#包括
#包括“拍卖价格.h”
使用名称空间std;
AuctionPrice\u Imp::AuctionPrice\u Imp()
{
}
AuctionPrice\u Imp::~AuctionPrice\u Imp()
{
}
int AuctionPrice_Imp::AddNewOrder(char*itemId,char*auctionId,int-Side,int-Price)
{
订单;
memcpy(order.itemId,itemId,strlen(itemId)+1);
memcpy(order.auctionId,auctionId,strlen(auctionId)+1);
顺序。边=边;
如果(边==1)
{   
BuyMap.insert(std::pair(价格、订单));
//buyLevels_u2;.insert(标准::成对<价格,级别<订单输入>>(价格,buyLevel));
}
否则,如果(边==2)
{
SellMap.insert(std::pair(价格、订单));
}
其他的
{
返回0;
}
返回1;
}
int AuctionPrice_Imp::DeleteOrder(char*itemId,char*auctionId)
{
返回0;
}
int AuctionPrice_Imp::Print()
{
标准::地图>::迭代器购买它;
标准::地图>::迭代器出售它;
//打印销售地图
for(sell_it=SellMap.begin();sell_it!=SellMap.end();sell_it++)
{
std::cout first AddNewOrder(“item2”、“order4”、2100);
拍卖价格_Imp->Print();
}
当我运行代码时,代码行出现分段错误:

memcpy(order.auctionId, auctionId, strlen(auctionId)+1);
请任何人都可以帮助或更正代码。 我调用的函数应该将订单添加到映射中:BuyMap和SellMap。一旦它们添加到这些映射中,我将使用print函数打印值

Order order;
这将创建一个新的
Order
对象。
Order
没有构造函数,因此其类成员
itemId
auctionId
都不会初始化为指向任何对象。这些指针是未初始化的随机垃圾。紧接着:

 memcpy(order.itemId, itemId, strlen(itemId)+1);
 memcpy(order.auctionId, auctionId, strlen(auctionId)+1);
由于无论是
itemId
,还是
auctionId
,都没有分别指向大小至少为
strlen(itemId)+1
strlen(auctionId)+1
的足够内存,这将导致未定义的行为和崩溃

在C++中,在使用指针之前,你有责任确保指针是有效的,并指向正确的对象、对象或足够大小的内存缓冲区。C++不会为你做这些,你必须自己完成所有的工作。 <>但是如果你想编写现代C++代码,那么使用C++类就简单多了,比如<代码> STD::String < /Calth>而不是普通代码> char */Cux>指针。<代码> STD::String S自动处理所有这些低级细节,正确地管理内存,而不让你有责任这样做。你会发现一个完整的DES。<代码> STD:Ctring 的注释以及在C++教科书中使用的许多例子。 这将创建一个新的
Order
对象。
Order
没有构造函数,因此其类成员
itemId
auctionId
都不会初始化为指向任何对象。这些指针是未初始化的随机垃圾。紧接着:

 memcpy(order.itemId, itemId, strlen(itemId)+1);
 memcpy(order.auctionId, auctionId, strlen(auctionId)+1);
由于无论是
itemId
,还是
auctionId
,都没有分别指向大小至少为
strlen(itemId)+1
strlen(auctionId)+1
的足够内存,这将导致未定义的行为和崩溃

在C++中,在使用指针之前,你有责任确保指针是有效的,并指向正确的对象、对象或足够大小的内存缓冲区。C++不会为你做这些,你必须自己完成所有的工作。
<>但是如果你想编写现代C++代码,那么使用C++类就简单多了,比如<代码> STD::String < /Calth>而不是普通代码> char */Cux>指针。<代码> STD::String S自动处理所有这些低级细节,正确地管理内存,而不让你有责任这样做。你会发现一个完整的DES。<代码> STD:String < /C> >和在C++教程中使用的许多例子。

< P>你应该使用<代码> STD::String 避免处理指针和内存分配的低级问题。这些是你在代码中出错的问题。这里的代码改写为<代码> STD::String < /Calp>

struct Order 
{
    std::string itemId;
    std::string auctionId;
    int Side;
};

int AuctionPrice_Imp::AddNewOrder(std::string itemId, std::string auctionId, int Side, int Price)
{    
    Order order;
    order.itemId = itemId;
    order.auctionId = auctionId;
    order.Side = Side;

看看这有多简单?使用
std::string
的代码与处理
int
的代码没有什么不同。您应该使用
std::string
来避免处理指针和内存分配的低级问题。这些是您在代码中出错的问题。下面是您的代码重写以供使用<代码>标准::字符串

struct Order 
{
    std::string itemId;
    std::string auctionId;
    int Side;
};

int AuctionPrice_Imp::AddNewOrder(std::string itemId, std::string auctionId, int Side, int Price)
{    
    Order order;
    order.itemId = itemId;
    order.auctionId = auctionId;
    order.Side = Side;

<> P> >使用代码> > STD::String >与处理<代码> int >的代码没有区别。

为什么所有指针,和<代码> MycPy < /C> >和代码> Strule<代码>?C++中有更好的方法来做这些事情。C++中有一个<代码> STD::String 类。为什么不使用它?如果你这样做了,那么