gpt4 book ai didi

c++ - 结构的 memcpy 操作中的段错误

转载 作者:行者123 更新时间:2023-12-02 09:52:32 25 4
gpt4 key购买 nike

我正在添加头文件和 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
AuctionPrices_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);
请任何人都可以帮助或更正代码。
我调用的函数应该将订单添加到 map 中:BuyMap 和 SellMap。一旦他们添加到这些 map 中,我将使用打印功能来打印这些值。

最佳答案

Order order;
这将创建一个新的 Order目的。 Order没有构造函数,所以没有它的类成员, itemId , 和 auctionId ,初始化为指向任何东西。这些指针是未初始化的随机垃圾。紧接着:
 memcpy(order.itemId, itemId, strlen(itemId)+1);
memcpy(order.auctionId, auctionId, strlen(auctionId)+1);
由于 itemId , 也不是 auctionId , 指向足够的内存,至少为 strlen(itemId)+1strlen(auctionId)+1分别在大小上,这会导致未定义的行为和崩溃。
在 C++ 中,在使用指针之前,您有责任确保指针有效,并指向正确的对象、对象或足够大小的内存缓冲区。 C++ 不会为你做这些,你必须自己做所有的工作。
但是,如果您的目的是编写现代 C++ 代码,那么使用 C++ 类会简单得多,例如 std::string s 而不是普通的 char *指针。 std::string s 自动处理所有这些低级细节,正确管理内存,而不是让你有责任这样做。您将找到 std::string 的完整描述。以及在您的 C++ 教科书中使用它的许多示例。

关于c++ - 结构的 memcpy 操作中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63334097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com