基本上,我将一个指向字符串的指针传递给我的构造函数,该构造函数在传递字符串值时初始化其基本构造函数。由于某些原因,strlen()不起作用,所以它没有进入正确的if语句。我已经检查过了,以确保变量中有一个值,并且确实存在。
这是我的代码,我去掉了所有不相关的部分:
标签分类内容:
Label(int row, int column, const char *s, int length = 0) : LField(row, column, length, s, false)
{
}
Label (const Label &obj) : LField(obj)\
{
}
~Label()
{
}
Field *clone() const
{
return new Label(*this);
}LField类内容:
LField(int rowNumVal, int colNumVal, int widthVal, const char *valVal = "", bool canEditVal = true)
{
if(strlen(valVal) > 0)
{
}
else
{
//This is where it jumps to, even though the value in
//valVal is 'SFields:'
val = NULL;
}
}
Field *clone() const
{
return new LField(*this);
}
LField(const LField &clone) {
delete[] val;
val = new char[strlen(clone.val) + 1];
strcpy(val, clone.val);
rowNum = clone.rowNum;
colNum = clone.colNum;
width = clone.width;
canEdit = clone.canEdit;
index = clone.index;
}Screen类内容:
class Screen {
Field *fields[50];
int numOfFields;
int currentField;
public:
Screen()
{
numOfFields = 0;
currentField = 0;
for(int i = 0; i < 50; i++)
fields[i] = NULL;
}
~Screen()
{
for (int i = 0; i < 50; i++)
delete[] fields[i];
}
int add(const Field &obj)
{
int returnVal = 0;
if (currentField < 50)
{
delete[] fields[currentField];
fields[currentField] = obj.clone();
numOfFields += 1;
currentField += 1;
returnVal = numOfFields;
}
return returnVal;
}
Screen& operator+=(const Field &obj)
{
int temp = 0;
temp = add(obj);
return *this;
}
};Main:
int main () {
Screen s1;
s1 += Label(3, 3, "SFields:");
}希望有人能发现我是否做错了什么。
发布于 2010-06-30 07:29:42
Marcin在这一点上,问题将归结为调试,我复制了你的代码,但有一些小的遗漏,并得到了正确的结果。
现在需要说明的是,您应该使用更多的C++惯用代码。例如,您应该使用std::string而不是const char*,使用std::vector而不是原始数组。
下面是一个使用std::string的LField构造函数的示例
#include <string> // header for string
LField(int rowNumVal,
int colNumVal,
int widthVal,
const std::string& valVal = "",
bool canEditVal = true)
{
std::cout << valVal;
if(valVal.length() > 0)
{
}
else
{
//This is where it jumps to, even though the value in
//valVal is 'SFields:'
//val = NULL;
}
}使用这些类型会让你的生活变得更容易,如果你做了改变,它可能也会解决你的问题。
PREVIOUS:这样您就可以确定字符串没有被正确传递,在strlen调用之前添加一个printline。完成此操作后,使用打印行进行反向操作,直到找到未设置字符串的位置。这是一种基本的调试技术。
Label(int row,
int column,
const char *s,
int length = 0) :
LField(row, column, length, s, false) {
}
LField(int rowNumVal,
int colNumVal,
int widthVal,
const char *valVal = "",
bool canEditVal = true)
{
std::cout << valVal << std::endl;
if(strlen(valVal) > 0)
{
}
else {
//This is where it jumps to, even though the value in
//valVal is 'SFields:'
val = NULL;
}
}发布于 2010-06-30 07:12:33
!..不,它不是。
在测量字符串之前,编写一个puts(valVal),以确保您不会错误地理解该变量的内容。
发布于 2010-06-30 08:54:50
每当出现这种奇怪的行为时,内存的混乱几乎总是罪魁祸首。切勿将新与delete[]或new[]与混合使用。后者比前者稍差一些,但它们都是坏消息。delete[]只能与new[]一起使用。混合这些分配/释放符号将导致未定义的行为。由于您从未使用过new[],因此请将所有delete[]调用替换为delete。在删除指针后,将指针设置为空也是一种良好的做法和良好的礼仪。你不太可能是唯一一个调试这段代码的人,而且调试你的指针时认为那里有有效的内存是非常恼人的,而实际上并没有。
混合这些notations必然会导致exploits和memory leaks。
https://stackoverflow.com/questions/3145399
复制相似问题