Reputation: 121
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
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
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