- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试“初始化”我在类声明中创建的数组,但我不知道自己做错了什么。我知道当您将数组传递给函数时,它会衰减为指向第一个字符的指针。代码在我的第二个 strcpy() 行中断,但我不确定我做错了什么(我对 strcpy() 的经验很少)。
我的代码如下:
class TestClass
{
public:
TestClass(char []);
~TestClass();
void Append(TestClass);
char* m_string;
};
TestClass::TestClass(char incstring[])
{
char currentChar = 'a';
int numOfChars = 0;
while (currentChar != '\0') {
currentChar = *(incstring + numOfChars);
numOfChars++;
}
char* tmp = new char[numOfChars-1];
strcpy(tmp, incstring);
strcpy(m_string, tmp);
}
我的 int main() 很简单:
int main(){
TestClass* test = new TestClass("Hello");
}
如果值得注意,numOfChars 等于 6,这是正确的。
抛出的异常是:“访问冲突写入位置 0xCDCDCDCD。”
最佳答案
在将数据从 tmp
复制到 m_string
之前,您没有为 m_string
分配任何内存。这就是你崩溃的原因。 m_string
未指向有效的内存地址。
因为你已经分配了tmp
并且你不会再使用它,你可以直接将tmp
指针分配给m_string
无需执行另一个拷贝。
此外,请注意您的 while
循环正在复制 strlen()
已经完成的工作,因此您应该只使用 strlen()
。
试试这个:
TestClass::TestClass(char incstring[])
: m_string(new char[strlen(incstring)+1])
{
strcpy(m_string, incstring);
}
TestClass::~TestClass()
{
delete[] m_string;
}
可以使用 strdup()
来简化(使用 free()
而不是 delete[]
来释放它):
TestClass::TestClass(char incstring[])
: m_string(strdup(incstring))
{
}
TestClass::~TestClass()
{
free(m_string);
}
话虽如此,您的 main()
正在泄漏内存,因为您没有释放 test
对象:
int main(){
TestClass* test = new TestClass("Hello");
//...
delete test; // <-- add this
}
或者简单地说:
int main(){
TestClass test("Hello");
}
最后,确保您实现了 Rule of Three在你的课上。您正在管理在析构函数中释放的动态内存,因此您还需要一个复制构造函数和一个复制赋值操作,以确保在从其他创建 TestClass
值时 m_string
的完整性TestClass
值:
class TestClass
{
private:
char* m_string;
public:
TestClass(char *incstring = 0);
TestClass(const TestClass &src);
~TestClass();
void Append(const TestClass &str);
void Swap(TestClass &Other);
TestClass& operator=(const TestClass &lhs);
};
TestClass::TestClass(char *incstring)
: m_string(0)
{
if (incstring)
{
m_string = new char[strlen(incstring)+1];
strcpy(m_string, incstring);
}
}
TestClass::TestClass(const TestClass &src)
: m_string(0)
{
if (src.m_string)
{
m_string = new char[strlen(src.m_string)+1];
strcpy(m_string, src.m_string);
}
}
TestClass::~TestClass()
{
delete[] m_string;
}
void TestClass::Append(const TestClass &str)
{
if (str.m_string)
{
TestClass tmp;
tmp.m_string = new char[strlen(m_string)+strlen(str.m_string)+1];
strcpy(tmp.m_string, m_string);
strcat(tmp.m_string, str.m_string);
Swap(tmp);
}
}
void TestClass::Swap(TestClass &Other)
{
char *ptr = m_string;
m_string = Other.m_string;
Other.m_string = ptr;
}
TestClass& TestClass::operator=(const TestClass &lhs)
{
if (this != &lhs) {
TestClass(lhs).Swap(*this);
}
return *this;
}
关于c++ - 使用传入数组初始化其他数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43531933/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!