Ubuntu User
Ubuntu User

Reputation: 121

Segmentation fault when calling destructor

Hey guys I'm fairly new at C++ and this is for my term project. When I make an IPADDRESS object on the STACK, the main.cpp file will run until the deconstructer member is called for the IPADDRESS object. The first section runs just fine, and the second section returns the same output, just with the segmentation error.

// Main file
#include <bits/stdc++.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include "IPInfo.h"

using namespace std;

// Function declaration of display()
void displayInfo(IPADDRESS);

int main(){

    const char* address = "cbc.ca";
    const char* command = "nslookup ";

        char buf[256];
        strcpy(buf, command);
        strcat(buf, address);

        string* Info = new(nothrow) string[256]; // Allocate 256 bytes to this string
        *Info = system(buf); // Allocate the response from the command line to Info (which is on the heap)
    cout << Info << endl << *Info << endl << "===============================" << endl << endl;
    delete[] Info;

    IPADDRESS test("cbc.ca");

    displayInfo(test);

// Displays but never exits the program correctly

    return 0;
}
void displayInfo(IPADDRESS Website){

    string* displayBus;
    displayBus = Website.getInfo();
    cout << displayBus;
}
// Header file
#ifndef IPInfo_H
#define IPInfo_H

#include <bits/stdc++.h>
#include <string>
#include <iostream>

using namespace std;
class IPADDRESS{
private:
    const char* command = "nslookup ";
    string url;
    string info;
    string address;
    int searchFor(string locator); // Find a substring in the getInfo string

public:
    string* getInfo(); // Using the system("nslookup") call, get the info (Will be allocated to heap)
    IPADDRESS(string website);
    ~IPADDRESS();
    string getIPAddress(); // Using searchFor() get rid of unneeded characters and dump the IPAddress to a string
    string getName(); // Also output the name

};

IPADDRESS::IPADDRESS(string website){
    url = website;
}

IPADDRESS::~IPADDRESS(){
}
#endif

Upvotes: 0

Views: 377

Answers (2)

Cory Kramer
Cory Kramer

Reputation: 117856

This is not correct

IPADDRESS::~IPADDRESS(){

    delete &address;
    delete &url;
    delete &info;
    delete command;
}

you cannot and should not delete any variable that you did not new.

The default compiler-generated destructor is sufficient and correct here (which you can completely remove, it will be implicitly generated in this case).

~IPADDRESS() = default;  // don't even need this, compiler will generate in this case

Upvotes: 4

MikeCAT
MikeCAT

Reputation: 75062

delete is for freeing what is allocated via new and you must not use it otherwise.

Currently your posted code contains no new, so the destructor should be:

IPADDRESS::~IPADDRESS(){
}

Also note that you should follow The Rule of Three if you use dynamic memory allocation. It is better to avoid bare dynamic memory allocation in C++.

Upvotes: 1

Related Questions