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



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

拍卖价格.h

#ifndef AuctionPrices_h
#define AuctionPrices_h      
/*
*
* class AuctionPrices - maintains Buy Order, Sell Order books
*/
#include <bits/stdc++.h> 
#include <map>
//#pragma pack(1)
struct Order 
{
char * itemId;
char * auctionId;
int Side;
};

class AuctionPrices 
{
public:
virtual int AddNewOrder(char *itemId, char *auctionId, int Side, int Price) = 0;
virtual int DeleteOrder(char *itemId, char *auctionId) = 0;

virtual int Print() = 0;
};

class AuctionPrice_Imp : public AuctionPrices 
{
public:
AuctionPrice_Imp();

~AuctionPrice_Imp();
std::map <int, Order, std::greater< int >> BuyMap;
std::map <int, Order, std::less< int >> SellMap;
int AddNewOrder(char *itemId, char *auctionId, int Side, int Price);
int DeleteOrder(char *itemId, char *auctionId);
int Print();
};
#endif

拍卖价格_ Imp.cpp

/** 
* Auction Price Class implementation
* Constructor, AddNewOrder, DeleteOrder, Print 
*
*/
#include <bits/stdc++.h> 
#include <map>
#include "AuctionPrices.h"
using namespace std;
AuctionPrice_Imp::AuctionPrice_Imp()
{
}
AuctionPrice_Imp::~AuctionPrice_Imp()
{
}

int AuctionPrice_Imp::AddNewOrder(char *itemId, char *auctionId, int Side, int Price)
{
Order order;
memcpy(order.itemId, itemId, strlen(itemId)+1);
memcpy(order.auctionId, auctionId, strlen(auctionId)+1);
order.Side = Side;
if (Side == 1)
{   
BuyMap.insert (std::pair<int,Order>(Price,order));
//buyLevels_.insert( std::pair< OfPrice, Level< OrderEntry > >( price, buyLevel ) );
}
else if (Side == 2)
{
SellMap.insert (std::pair<int,Order>(Price,order));
}
else 
{
return 0;
}


return 1;
}
int AuctionPrice_Imp::DeleteOrder(char *itemId, char *auctionId)
{


return 0;
}
int AuctionPrice_Imp::Print()
{
std::map <int,Order,std::greater< int >>::iterator buy_it;
std::map <int,Order,std::less< int >>::iterator sell_it;
// Print Sell Map
for ( sell_it = SellMap.begin();sell_it != SellMap.end(); sell_it++)
{
std::cout << sell_it->first << 't' << std::endl;
}   
// Print Buy Map
for ( buy_it = BuyMap.begin();buy_it != BuyMap.end(); buy_it++)
{
std::cout << buy_it->first << 't' << std::endl;
}   

return 1;
}

int main()
{
AuctionPrice_Imp * auctionPrice_Imp = new AuctionPrice_Imp();

/*
AddNewOrder(“item1”, “auction1”, 1, 100)
AddNewOrder(“item1”, “auction2”, 1, 101)
AddNewOrder(“item2”, “order3”, 1, 99)
AddNewOrder(“item2”, “order4”, 2, 100)

*/

auctionPrice_Imp->AddNewOrder("item1", "auction1", 1, 100);
auctionPrice_Imp->AddNewOrder("item1", "auction2", 1, 101);
auctionPrice_Imp->AddNewOrder("item2", "order3", 1, 99);
auctionPrice_Imp->AddNewOrder("item2", "order4", 2, 100);

auctionPrice_Imp->Print();
}

当我运行代码时,它在以下行出现分段错误:

memcpy(order.auctionId, auctionId, strlen(auctionId)+1);

请任何可以帮助或更正代码的人。我调用的函数应该将订单添加到Maps:BuyMap和SellMap。一旦他们添加到这些地图中,我就使用打印功能来打印值。

Order order;

这将创建一个新的Order对象。Order没有构造函数,所以它的类成员itemIdauctionId都不会被初始化为指向任何对象。这些指针是未初始化的随机垃圾。紧接着:

memcpy(order.itemId, itemId, strlen(itemId)+1);
memcpy(order.auctionId, auctionId, strlen(auctionId)+1);

由于itemIdauctionId都没有分别指向大小至少为strlen(itemId)+1strlen(auctionId)+1的足够内存,这将导致未定义的行为和崩溃。

在C++中,在使用指针之前,您有责任确保指针有效,并指向正确的对象、对象或足够大小的内存缓冲区。C++不会为你做这些,你必须自己做所有的工作。

但是,如果您的意图是编写现代C++代码,那么只使用C++类(如std::strings(而不是普通的char *指针要简单得多。std::string会自动处理所有这些低级细节,正确管理内存,而不是由你自己负责。你会在C++教材中找到std::string的完整描述和许多使用它的例子。

您应该使用std::string来避免处理指针和内存分配的低级别问题。这些都是您在代码中出错的问题。这是您改写为使用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;

看看这有多容易?使用std::string的代码与处理int的代码没有什么不同。

最新更新