繁体   English   中英

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

[英]Segmentation Fault in memcpy operation of a struct

我正在添加 header 文件和 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);

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

Order order;

这将创建一个新Order object。 Order没有构造函数,因此它的 class 成员itemIdauctionId都没有被初始化为指向任何东西。 这些指针是未初始化的随机垃圾。 紧接着:

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

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

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

但是,如果您的意图是编写现代 C++ 代码,那么使用 C++ 类(例如std::string s 而不是普通的char *指针)要简单得多。 std::string s 自动处理所有这些低级细节,正确管理 memory,而不是让您有责任这样做。 您将在 C++ 教科书中找到std::string的完整描述以及许多使用它的示例。

您应该使用std::string来避免处理指针和 memory 分配的低级问题。 这些是您在代码中遇到的问题。 这是您重写的代码以使用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的代码没有什么不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM