2013-02-28 46 views
0

我调整了大小的对象的动态数组。调整大小后,我可以调用int和double对象的set方法,但不使用字符串调用任何setter方法对象。每当我试图调用setter方法调整大小后的数组我得到一个核心转储的新指标。获取“分段错误:尝试将字符串写入设置器时发生核心转储

这的是产生错误代码的主要部分。

void resizeAccounts(int newSize, Account *accounts, int acctNum, std::string fName,  :string lName, std::string acctP, double balance) 
{  
Account* newArr = new Account[newSize]; 

for (int i=0; i<newSize-1; i++) 
    newArr[i]=accounts[i]; 

delete [] accounts; 
accounts = newArr; 
accounts[newSize].setAccountNum(acctNum); 
accounts[newSize].setFirstName(fName); 
accounts[newSize].setLastName(lName); 
accounts[newSize].setAccountPassword(acctP); 
accounts[newSize].setBalance(balance); 

for(int i=0; i<newSize; i++) 
    std::cout << accounts[i].getAccountNum() << std::endl; 

的制定者我正在使用

void Account::setFirstName(std::string fName) 
{ firstName = fName; } 
void Account::setLastName(std::string lName) 
{ lastName = lName; } 
void Account::setAccountPassword(std::string acctPass) 
{ accountPassword = acctPass; } 
void Account::setAccountNum(int acctNum) 
{ accountNum = acctNum; } 
void Account::setBalance(double bal) 
{ balance = bal; }` 

这是作业,我不允许使用矢量或大多数STL库。 谢谢,

+2

您可以使用'std :: vector '并删除所有手动内存管理吗? – juanchopanza 2013-02-28 22:16:34

+0

有些不相关的注释,但是你真的希望通过const引用而不是按值传递字符串到setter中。这是很好的做法,并避免不必要的额外副本。 – 2013-02-28 22:19:18

+0

'resizeAccounts'的语义应该是什么呢?你为什么要在新的“账户”上设置一些东西?例如,如果'newSize == oldSize',大概你根本不想改变任何东西,是吗? – 2013-02-28 23:04:16

回答

5

数组索引运行从0N - 1所以此:

accounts[newSize].setAccountNum(acctNum); 
     //^^^^^^^^^ 

正在访问一个过去的数组的末尾,从而导致未定义的行为。因此accounts的有效索引为0newSize - 1。因为std::vector不允许我不会提到它。完全一样。

+0

谢谢,我想我一直在盯着这太久。这是程序试图访问数组以外的数组。 – user2121453 2013-02-28 22:21:54

0

C++使用基于0的数组。这意味着当您分配一个大小为10的数组时,第一个元素位于索引0,最后一个元素位于索引9。在这种情况下,您将分配一个大小为newSize的数组,然后访问newSize元素。这不是数组的一部分,因为最后一个元素是newSize - 1。这就是你遇到碰撞的原因。

相关问题