473,382 Members | 1,368 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,382 software developers and data experts.

std::string and gcc problem ?

Hi Guys,
i've problem with my small C++ programm. I've just small template
class which represetns a array, everything works fine up to
combination with std::string. I did tried it with M$ VC++ and with GCC
(Cygwin and Linux) and my problem is when i try do this

int main(int argc, char **argv) {
array<std::stringa(10);

a[0] = "Huhuhu"; <--- with gcc i got a crash !

std::string = a[0];
return 0;
}
the program crashes with segmentation fault on std::string::assign(),
but just with gcc ?!
Can somebode help me solve this problem ?

peter

.... and here is my code

#ifndef _array_h
#define _array_h
#include <stdexcept>
#include <sstream>
#include <stdlib.h>
#include <memory.h>
#ifdef _DEBUG
#include <iostream>
#endif

template <typename T>
class array {
public:
array(size_t ) throw(std::bad_alloc &);
array(const array<T& ) throw(std::bad_alloc &);
~array();

T& operator[](size_t ) throw(std::out_of_range &);
const T&operator[](size_t ) const throw(std::out_of_range &);

size_t length() const { return size; }

int compare(const array<T& ) const;

bool operator==(const array<T&arg ) { return compare(arg) == 0; }
bool operator!=(const array<T&arg ) { return compare(arg) != 0; }
bool operator<(const array<T&arg ) { return comapre(arg) < 0; }
bool operator>(const array<T&arg ) { return compare(arg) 0; }
bool operator!() const { return length 0; }

private:
T *data;
size_t size;
};

#endif

template <typename T>
array<T>::array(size_t e) throw(std::bad_alloc & )
{
data = NULL; size = 0;
data = new T[e];
size = e;
}

template <typename T>
array<T>::~array()
{
if(data != NULL)
delete [] data;
data = NULL;
size = 0;
}

template <typename T>
const T& array<T>::operator[](size_t idx) const
throw(std::out_of_range &)
{
if(idx size) {
std::stringstream error;
error << "idx size " << __FILE__ << "(" << __FUNCTION__ << ":" <<
__LINE__ << ")";
#ifdef _DEBUG
std::cerr << error.c_str() << std::endl;
#endif
throw std::out_of_range(error.str());
}

return data[idx];
}
template <typename T>
T& array<T>::operator[](size_t idx) throw(std::out_of_range &)
{
if(idx size) {
std::stringstream error;
error << "idx size " << __FILE__ << "(" << __FUNCTION__ << ":" <<
__LINE__ << ")";
#ifdef _DEBUG
std::cerr << error.str().c_str() << std::endl;
#endif
throw std::out_of_range(error.str());
}

return data[idx];
}

Mar 7 '07 #1
4 11202
da*****@gmx.net wrote:
i've problem with my small C++ programm. I've just small template
class which represetns a array, everything works fine up to
combination with std::string. I did tried it with M$ VC++ and with GCC
(Cygwin and Linux) and my problem is when i try do this

int main(int argc, char **argv) {
Why do you need 'argc' and 'argv'? You never use them!
array<std::stringa(10);
'array' is undeclared at this point. But presuming you have included
your template definition from below somehow... Supposedly here you
have create an array that internally allocates 10 strings and allows
you the use of all of them, right?
>
a[0] = "Huhuhu"; <--- with gcc i got a crash !
And with VC++ you don't, correct?

So, 'a[0]' returns a reference to the zeroth element in your array in
the 'a' object. Having looked at the operator[], I don't see any
problem with it. Did you try using a debugger to see what values you
get into the 'std::string::assign'?
>
std::string = a[0];
This shouldn't even compile! How did you get a crash? Are you
sure you posted your _real_ code?
return 0;
}
the program crashes with segmentation fault on std::string::assign(),
but just with gcc ?!
Can somebode help me solve this problem ?
If it's a GNU-specific problem, GNU people should be able to help.
The code looks fine but only if one assumes that the stuff that you
omitted is correct.
>
peter

... and here is my code

#ifndef _array_h
#define _array_h
Avoid leading underscores like the plague. Any identifier that begins
with an underscore is reserved in the global namespace.
#include <stdexcept>
No such standard header.
#include <sstream>
#include <stdlib.h>
#include <memory.h>
#ifdef _DEBUG
#include <iostream>
#endif

template <typename T>
class array {
public:
array(size_t ) throw(std::bad_alloc &);
array(const array<T& ) throw(std::bad_alloc &);
~array();

T& operator[](size_t ) throw(std::out_of_range &);
const T&operator[](size_t ) const throw(std::out_of_range &);

size_t length() const { return size; }

int compare(const array<T& ) const;

bool operator==(const array<T&arg ) { return compare(arg) == 0; }
bool operator!=(const array<T&arg ) { return compare(arg) != 0; }
bool operator<(const array<T&arg ) { return comapre(arg) < 0; }
bool operator>(const array<T&arg ) { return compare(arg) 0; }
Why aren't those operators 'const'?
bool operator!() const { return length 0; }

private:
T *data;
size_t size;
};

#endif

template <typename T>
array<T>::array(size_t e) throw(std::bad_alloc & )
{
data = NULL; size = 0;
What is that for?
data = new T[e];
size = e;
}

template <typename T>
array<T>::~array()
{
if(data != NULL)
delete [] data;
data = NULL;
size = 0;
}

template <typename T>
const T& array<T>::operator[](size_t idx) const
throw(std::out_of_range &)
{
if(idx size) {
std::stringstream error;
error << "idx size " << __FILE__ << "(" << __FUNCTION__ << ":" <<
__LINE__ << ")";
#ifdef _DEBUG
std::cerr << error.c_str() << std::endl;
#endif
throw std::out_of_range(error.str());
}

return data[idx];
}
template <typename T>
T& array<T>::operator[](size_t idx) throw(std::out_of_range &)
{
if(idx size) {
std::stringstream error;
error << "idx size " << __FILE__ << "(" << __FUNCTION__ << ":" <<
__LINE__ << ")";
#ifdef _DEBUG
std::cerr << error.str().c_str() << std::endl;
#endif
throw std::out_of_range(error.str());
}

return data[idx];
}
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Mar 7 '07 #2
On 7 Mar, 13:59, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
daro...@gmx.net wrote:
#include <stdexcept>

No such standard header.
Where does your implementation declare std::logic_error and the like
then?

Gavin Deane

Mar 7 '07 #3
Gavin Deane wrote:
On 7 Mar, 13:59, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
>daro...@gmx.net wrote:
>>#include <stdexcept>

No such standard header.

Where does your implementation declare std::logic_error and the like
then?
My mistake.
Mar 7 '07 #4

da*****@gmx.net wrote:
>
int main(int argc, char **argv)
argc, argv are never used
{
array<std::stringa(10);

a[0] = "Huhuhu"; <--- with gcc i got a crash !
comment sign // lost
>
std::string = a[0];
error assignment to type

std::string tmp= a[0];
return 0;
}

template <typename T>
class array {
public:
array(size_t ) throw(std::bad_alloc &);
array(const array<T& ) throw(std::bad_alloc &);
extra <Tfor "array<T&"
array(const array& ) throw(std::bad_alloc &);

assignment operator lost
array& operator=(const array& ) throw(std::bad_alloc &);
>
template <typename T>
array<T>::array(size_t e) throw(std::bad_alloc & )
{
data = NULL; size = 0;
data = new T[e];
size = e;
}
assignment instead of initialization,
extra assignment to data, size

template <typename T>
array<T>::array(size_t e) throw(std::bad_alloc & )
:data( e? new T[e]: 0),
size(e)
{}
>
template <typename T>
array<T>::~array()
{
if(data != NULL)
rare needed, here extra comparsion with "data"
delete [] data;
data = NULL;
rare needed, here extra assignment to "data"
size = 0;
more rare needed, here extra assignment to "size"
}

template <typename T>
const T& array<T>::operator[](size_t idx) const
throw(std::out_of_range &)
{
if(idx size) {
if(idx >= size) {

assuming idx, size unsigned
size is 1..N or empty
idx is 0..size-1 or overflow
std::stringstream error;
error << "idx size " << __FILE__ << "(" << __FUNCTION__ << ":" <<
__LINE__ << ")";
#ifdef _DEBUG
std::cerr << error.c_str() << std::endl;
#endif
throw std::out_of_range(error.str());
}

return data[idx];
}
template <typename T>
T& array<T>::operator[](size_t idx) throw(std::out_of_range &)
{
if(idx size) {
if(idx >= size) {
std::stringstream error;
error << "idx size " << __FILE__ << "(" << __FUNCTION__ << ":" <<
__LINE__ << ")";
#ifdef _DEBUG
std::cerr << error.str().c_str() << std::endl;
#endif
throw std::out_of_range(error.str());
}

return data[idx];
}
***********
a[0] = "Huhuhu"; //<--- with gcc i got a crash !
std::string::assign(...
/**
* The data is copied,

so must not be errors here

--
Maksim A. Polyanin
http://grizlyk1.narod.ru/cpp_new

"In thi world of fairy tales rolls are liked olso"
/Gnume/
Mar 8 '07 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

10
by: Angus Leeming | last post by:
Hello, Could someone explain to me why the Standard conveners chose to typedef std::string rather than derive it from std::basic_string<char, ...>? The result of course is that it is...
11
by: Christopher Benson-Manica | last post by:
Let's say I have a std::string, and I want to replace all the ',' characters with " or ", i.e. "A,B,C" -> "A or B or C". Is the following the best way to do it? int idx; while(...
5
by: Peter Jansson | last post by:
Hello, I have the following code: std::map<int,std::set<std::string> > k; k="1234567890"; k="2345678901"; //... std::set<std::string> myMethod(std::map<int,std::set<std::string> > k)...
14
by: brad | last post by:
I've got a multithreaded application using std::string in Linux. Performance is not very good so I ran Quantify(tm) to look at what is happening. Most of the time my app was calling...
22
by: Jason Heyes | last post by:
Does this function need to call eof after the while-loop to be correct? bool read_file(std::string name, std::string &s) { std::ifstream in(name.c_str()); if (!in.is_open()) return false; ...
19
by: Erik Wikström | last post by:
First of all, forgive me if this is the wrong place to ask this question, if it's a stupid question (it's my second week with C++), or if this is answered some place else (I've searched but not...
8
by: Patrick Kowalzick | last post by:
Dear NG, I would like to change the allocator of e.g. all std::strings, without changing my code. Is there a portable solution to achieve this? The only nice solution I can think of, would be...
16
by: Khuong Dinh Pham | last post by:
I have the contents of an image of type std::string. How can I make a CxImage object with this type. The parameters to CxImage is: CxImage(byte* data, DWORD size) Thx in advance
84
by: Peter Olcott | last post by:
Is there anyway of doing this besides making my own string from scratch? union AnyType { std::string String; double Number; };
11
by: Jacek Dziedzic | last post by:
Hi! I need a routine like: std::string nth_word(const std::string &s, unsigned int n) { // return n-th word from the string, n is 0-based // if 's' contains too few words, return "" //...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.