0

Trying to write simple code to simulate parsing packages in the factory. I am sending a package which is saved in the buffer like:

sending class:

class PackageSender {
public:   
    void send_package();
    std::optional<Package> get_sending_buffer();
    void push_package(Package&&);
    std::optional<Package> sending_buffer;
public:
    ReceiverPreferences receiver_preferences;

};

    void PackageSender::push_package(Package &&p) {
    if(!sending_buffer){

        sending_buffer.emplace(std::move(p));
    }

}

using function:

void PackageSender::send_package() {

IPackageReceiver* receiver=receiver_preferences.choose_receiver(); //choose receiver from a list

   if(sending_buffer.has_value())
{
    receiver->receive_package(std::move(sending_buffer.value());
    sending_buffer.reset();
}
}

While passing argument to the functon of an object:

`void Worker::receive_package(Package &&p) {


    queue_pointer->push(std::move(p));

    push_package(queue_pointer->pop());


  }`

Package has moving operator defined as default:

Package& operator=(Package&&)= default;

The function below works fine while passing object like:

Package p;    
receive_package(std::move(p));

It seems that the argument passed to the function in pointing on an empty place as follows:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

Thank you in advance.

Stidgeon
  • 2,673
  • 8
  • 20
  • 28
  • Try letting it run in a debugger to obtain better error messages (dont forgot to compile with debug symbols (`-g` on linux)). Also have you tested `Package p; std::optional opt{std::move(p)}; receive_package(std::move(opt.value());`? – n314159 Dec 22 '19 at 00:09
  • @Stidgeon the problem in the test you proposed appears while trying to call: receive_package(std::move(opt.value()); – smakethunter Dec 22 '19 at 11:10
  • `PackageQueue queue2(PackageQueueType::FIFO); Storehouse s1(1,std::make_unique(std::move(queue2))); Package stest; std::optional opt{std::move(stest)}; ASSERT_EQ(opt.value().get_id(), 1); s1.receive_package(std::move(opt.value())); //ASSERT_EQ(s1.begin()->get_id(),6);` – smakethunter Dec 22 '19 at 11:14
  • Ok it seems there was a problems with id assignement using constructor `Package (Package&&);` now it is fine, than you for your help. – smakethunter Dec 22 '19 at 11:39

0 Answers0