分段错误 - 分配类困难
Segmentation Fault - Difficulty with assigning a class
我正在尝试分配我的类DictObj
来创建该类的新实例。它想要做的是有一个指向创建的类的指针,而不是实际的对象。
如果我要做它喜欢的事情,并且有:DictObj * d;
,然后说"d->load();
"之类的话,这让我在将字符串分配给字符串时很困难。例如 with,假设 word 的类型为string
、word = a;
,其中 a 也是作为相同类型的参数传递的字符串(没有指针或引用)。当我这样做时,它给了我一个分段错误。
关于如何解决此问题的任何建议?下面,我将展示一个代码示例:
附言我知道我正在添加"字典.cpp",即使我不应该这样做。它给了我一个错误
/tmp/ccEFPwDS.o:在函数"main"中:/home/courtneymaroney/Desktop/Courtney/Documents/AI/NEW/main.cpp:60:未定义对
DictObj::load()
的引用
实际代码:
#include<iostream>
#include<iomanip>
#include<vector>
#include<string>
#include<thread>
#include<cassert>
#include<exception>
#include"Directory.hpp"
#include"Dicts.cpp"
#include"Tests.hpp"
int main() {
cout << "Hellonn";
DictObj * d;
d->load();
return 0;
}
这是字典.cpp
void DictObj::setW(string a)
{
word = a;
}
这在运行该方法时给了我一个分段错误:
void DictObj::load()
{
string temp;
cout <<"Type New Word: ";
getline(cin, temp);
cin >> temp;
setW(temp);
代码继续,但错误在"setW(temp)">
如果我尝试在主类中创建一个新的 DictObj,正如预期的那样,那么它会给我一个错误
法典:
int main() {
cout << "Hellonn";
DictObj d = new DictObj();
d.load();
return 0;
}
错误:
g++ -std=c++14 -Wall -c "main.cpp" (in directory: /home/courtneymaroney/Desktop/Courtney/Documents/AI/NEW)
main.cpp: In function ‘int main()’:
main.cpp:59:26: error: conversion from ‘DictObj*’ to non-scalar type ‘DictObj’ requested
DictObj d = new DictObj();
^
Compilation failed.
另外:我的编译代码如下(我正在使用Geany)
g++ -std=c++14 -Wall -c "%f"
我的构建代码如下:
g++ -g -std=c++14 -Wall -Wextra -pedantic -lpthread -o "%e" "%f"
DictObj 类的定义:
class DictObj
{
public:
DictObj();
DictObj(const DictObj&);
void load();
void setW(string);
private:
string word;
};
您的第一个版本DictObj * d; d->load();
崩溃,因为您取消引用未初始化的指针d
。因此,由于d
不指向有效对象,因此d->load()
将导致未定义的行为(并且很可能是崩溃)。
您的第二个版本根本无法编译,因为您将指针值分配给对象值。写DictObj* d = new DictObj(); d->load()
或DictObj d; d.load()
。
请参阅以下代码,该代码可编译且不会崩溃:
#include <iostream>
using std::string;
class DictObj
{
public:
DictObj() {};
DictObj(const DictObj&);
void load() {
string temp;
std::cout <<"Type New Word: ";
getline(std::cin, temp);
std::cin >> temp;
setW(temp);
};
void setW(string a)
{
word = a;
};
private:
string word;
};
int main(int argc, char* argv[]) {
DictObj d;
d.load();
return 0;
}
毕竟是无用的。
我发现代码最可能的问题是我正在使用类定义来创建相同类定义的类定义。即 在类 DictObj 中,我在构造函数中定义了一个 DictObj 类型的变量。我将不得不重写该类以分离向量(其中大部分)和基本 DictObj 节点(非向量)。
嘭嘭。
我的愚蠢。
我想要吸取的教训是,在创建新对象时,永远不要在构造函数中的类中定义您的类。
至少我学到了宝贵的一课!
- vector.resize()中的分配错误
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 如何处理以下代码中的内存分配错误
- 动态内存分配错误
- C++向量上的分配错误
- libtorrent file_storage无效:分配错误
- 数组大小分配错误
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- C++ 内存分配错误?
- 具有特征成员变量分类和分配错误的C 类
- 为什么这种递归子集和算法会导致指针分配错误
- CSTRING分配错误
- 运行时间内存分配错误
- 以下C++代码给出了一些内存分配错误
- 尝试在c++中创建USRP对象时分配错误
- 多阵列动态内存分配错误
- C++:矢量分配错误
- 通过结构指针访问结构变量分配错误数据
- 声明向量时出现神秘的 malloc 内存分配错误