【发布时间】:2020-11-25 16:10:30
【问题描述】:
大家好,我是 C++ 新手,这是我的学期项目。当我在堆栈上创建 IPADDRESS 对象时,main.cpp 文件将运行,直到为 IPADDRESS 对象调用解构器成员。第一部分运行良好,第二部分返回相同的输出,只是有分段错误。
// 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
【问题讨论】:
-
请研究自动分配和动态分配之间最基本的区别,除了
ALL_CAPS中的宏名称之外不要提供任何东西(也不要使用宏;-)) -
delete表达式只能用于对应的new表达式的结果。没有初始化&address、&url、&info或command的new表达式,因此它们都不应该在delete表达式中使用。因此,您的析构函数的行为是未定义的。 -
您不应更改与此问题相关的原始代码。现在您编辑的代码不适合原始问题。您应该先发布所有内容,然后给出的答案将概述您在析构函数中所犯的错误,以及您在其余代码中所犯的其他错误。
-
我现在知道了,正如我之前所说,我是这个社区的新手,非常感谢。
标签: c++ segmentation-fault destructor